给SQL Server存储过程,传送数组参数(多个参数)的变通办法

        最近在做开发过程中碰到这么一个纠结的问题,需要同时插入N条数据,不想在程序里控制,但是SQL Sever又不支持数组参数.所以只能用变通的办法了.利用SQL Server强大的字符串处理传把数组格式化为类似"3500320083208#3500600520890#3500741122924#3500790143280#3501010510869#3500741129750", 然后在存储过程中用SubString配合CharIndex把它分割开来。


stored procedured 如下:

--同时插入N条数据
CREATE PROCEDURE dbo.dis_insertBackStation
    @delivery varchar(50), --@usid bigint,
    @postationid varchar(50),    --@stid varchar(50)
    @sn varchar(500)
AS
    DECLARE @PointerPrev int
    DECLARE @PointerCurr int
    DECLARE @TSn varchar(50)
    DECLARE @puid varchar(50),@stid varchar(50),@usid varchar(50)
    --DECLARE @TId int
    
    Set @PointerPrev=1
    set @PointerCurr=1
    
    begin transaction
    Set NoCount ON
    --delete  from ProductListSpecial where ModuleId=@ModuleId
    select @usid = usid from usr_users where username = @delivery  --'shoulijun'
    select @stid = stid from sta_station where postationid = @postationid   --5400010240-- postationid --5480011708
    --select @puid = puid from dis_war where sn = @sn  --这个sn必须要是分解后的
    
    
    --第一个
    Set @PointerCurr=CharIndex('#',@sn,@PointerPrev+1)
    set @TSn=cast(SUBSTRING(@sn,@PointerPrev,@PointerCurr-@PointerPrev) as varchar(50))
    select @puid = puid from dis_war where sn = @sn  --这个sn必须要是分解后的
    insert into dis_backstation (bsid,puid,stid,usid,totalmoney,outcash,outmort,incash,ivt,inconvert,createtime) values(NEWID(),@puid,@stid,@usid,0,0,0,0,0,0,GETDATE())
    SET @PointerPrev = @PointerCurr
    while (@PointerPrev+1 < LEN(@sn))
    Begin
        Set @PointerCurr=CharIndex('#',@sn,@PointerPrev+1)
        if(@PointerCurr>0)
        Begin
        --中间的
            set @TSn=cast(SUBSTRING(@sn,@PointerPrev+1,@PointerCurr-@PointerPrev-1) as varchar(50))
            select @puid = puid from dis_war where sn = @sn  --这个sn必须要是分解后的
            insert into dis_backstation (bsid,puid,stid,usid,totalmoney,outcash,outmort,incash,ivt,inconvert,createtime) values(NEWID(),@puid,@stid,@usid,0,0,0,0,0,0,GETDATE())
            SET @PointerPrev = @PointerCurr
        End
        else
            Break
    End
    
    --最后的
    set @TSn=cast(SUBSTRING(@sn,@PointerPrev+1,LEN(@sn)-@PointerPrev) as varchar(50))
   select @puid = puid from dis_war where sn = @sn  --这个sn必须要是分解后的
   insert into dis_backstation (bsid,puid,stid,usid,totalmoney,outcash,outmort,incash,ivt,inconvert,createtime) values(NEWID(),@puid,@stid,@usid,0,0,0,0,0,0,GETDATE())
    Set NoCount OFF
    if @@error=0
    begin
        commit transaction
    end
    else
    begin
        rollback transaction
    end
GO


执行前查询:

select * from dis_backstation order by createtime



执行:

exec dis_insertBackStation 'songlijun','0540002070','3500320083208#3500600520890#3500741122924#3500790143280#3501010510869#3500741129750'


查询执行后结果:

select * from dis_backstation order by createtime


对比执行前后的结果,可以发现多了6条记录。此6条即为插入的相关记录。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值