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

來源:互聯網
上載者:User
最近一直在做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
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.