程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 為SQL Server傳數組參數的變通辦法

為SQL Server傳數組參數的變通辦法

編輯:關於SqlServer
最近一直在做Dnn模塊的開發,過程中碰到這麼一個問題,需要同時插入N條數據,不想在程序裡控制,但是SQL Sever又不支持數組參數.所以只能用變通的辦法了.利用SQL Server強大的字符串處理傳把數組格式化為類似"1,2,3,4,5,6"。
  
   然後在存儲過程中用SubString配合CharIndex把分割開來
  
   詳細的存儲過程
  
   CREATE PROCEDURE dbo.ProductListUpdateSpecialList
   @ProductId_Array varChar(800),
   @ModuleId int
   AS
   DECLARE @PointerPrev int
   DECLARE @PointerCurr int
   DECLARE @TId int
   Set @PointerPrev=1
   set @PointerCurr=1
  
   begin transaction
   Set NoCount ON
   delete from ProductListSpecial where ModuleId=@ModuleId
  
   Set @PointerCurr=CharIndex(',',@ProductId_Array,@PointerPrev+1)
   set @TId=cast(SUBSTRING(@ProductId_Array,@PointerPrev,@PointerCurr-@PointerPrev) as int)
   Insert into ProductListSpecial (ModuleId,ProductId) Values(@ModuleId,@TId)
   SET @PointerPrev = @PointerCurr
   while (@PointerPrev+1 < LEN(@ProductId_Array))
   Begin
   Set @PointerCurr=CharIndex(',',@ProductId_Array,@PointerPrev+1)
   if(@PointerCurr>0)
   Begin
   set @TId=cast(SUBSTRING(@ProductId_Array,@PointerPrev+1,@PointerCurr-@PointerPrev-1) as int)
   Insert into ProductListSpecial (ModuleId,ProductId) Values(@ModuleId,@TId)
   SET @PointerPrev = @PointerCurr
   End
   else
   Break
   End
  
   set @TId=cast(SUBSTRING(@ProductId_Array,@PointerPrev+1,LEN(@ProductId_Array)-@PointerPrev) as int)
   Insert into ProductListSpecial (ModuleId,ProductId) Values(@ModuleId,@TId)
   Set NoCount OFF
   if @@error=0
   begin
   commit transaction
   end
   else
   begin
   rollback transaction
   end
   GO
  
   網友Bizlogic對此的改進方法:
  
   應該用SQL2000 OpenXML更簡單,效率更高,代碼更可讀:
  
   CREATE Procedure [dbo].[ProductListUpdateSpecialList]
   (
   @ProductId_Array NVARCHAR(2000),
   @ModuleId INT
   )
  
   AS
  
   delete from ProductListSpecial where ModuleId=@ModuleId
  
   -- If empty, return
   IF (@ProductId_Array IS NULL OR LEN(LTRIM(RTRIM(@ProductId_Array))) = 0)
   RETURN
  
   DECLARE @idoc int
  
   EXEC sp_xml_preparedocument @idoc OUTPUT, @ProductId_Array
  
   Insert into ProductListSpecial (ModuleId,ProductId)
   Select
   @ModuleId,C.[ProductId]
   FROM
   OPENXML(@idoc, '/Products/Product', 3)
   with (ProductId int ) as C
   where
   C.[ProductId] is not null
  
   EXEC sp_xml_removedocument @idoc
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved