给SQL Server传送数组参数的变通办法

最近一直在做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对此的改进方法:

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [SQL Server] 的这些文章也感兴趣:

SQL Server 2000安装和基本框架
给SQL Server传送数组参数的变通办法
将XML文件导入SQL Server 2000
SQL Server 2005: 存储过程签名
SQL Server 连接基础知识
最后的升级:SQL Server 2005 SP3 年底发布
SQLServer悲观锁定和乐观锁定应用实例
保护SQL Server 2000的十个步骤
SQL Server 利用排序规则计算汉字笔划和取得拼音首字母
SQL2005缓存计划小结