设为首页 收藏本站
查看: 1336|回复: 0

[经验分享] SQL Server存储过程 对数组参数的循环处理

[复制链接]

尚未签到

发表于 2015-7-3 05:35:42 | 显示全部楼层 |阅读模式
  方法一 分割
  例:通过SQL Server存储过程传送数组参数删除多条记录
  eg. ID 值为'1,2,3' 以下存储过程就是删除表中id号为1,2,3的记录:
  CREATE PROCEDURE DeleteNews
    @ID nvarchar(500)
as
    DECLARE @PointerPrev int
    DECLARE @PointerCurr int
    DECLARE @TId int
    Set @PointerPrev=1
     
    while (@PointerPrev < LEN(@ID))
    Begin
        Set @PointerCurr=CharIndex(',',@ID,@PointerPrev)
        if(@PointerCurr>0)
        Begin
            set @TId=cast(SUBSTRING(@ID,@PointerPrev,@PointerCurr-@PointerPrev) as int)
            Delete from News where
ID=@TID
            SET @PointerPrev = @PointerCurr+1
        End
        else
            Break
    End
    --删除最后一个,因为最后一个后面没有逗号,所以在循环中跳出,需另外再删除
     set @TId=cast(SUBSTRING(@ID,@PointerPrev,LEN(@ID)-@PointerPrev+1) as int)
     Delete from News where
ID=@TID
GO

  
  方法二 Table对象
  传3个参数,都是数组形式还有时间类型用存储过程更新
  @Oid = 1,2,3,4
  @Did = 111,222,333,444
  @DateArr = '2007-1-1,2007-1-2,2007-1-3,2007-1-4'
  
  CREATE proc Test999
  @Oid nvarchar(1000)    --ID1
  ,@Did nvarchar(1000)   --ID2
  ,@DateArr nvarchar(1000) --日期
  AS
  DECLARE @id1s varchar(8000), @id2s varchar(8000), @dates varchar(8000)
  set @id1s=@Oid        
  set @id2s=@Did        
  set @dates = @DateArr
  -- 调用函数实现处理
  SELECT @id1s=@id1s, @id2s=@id2s,@dates = @dates
  
  UPDATE A SET terminate_time = B.dt
  FROM [Table] A,(
  SELECT
      id1 = CONVERT(int, Desk_id.value),
      id2 = CONVERT(int, room_id.value),
      dt = CONVERT(datetime, terminate_time.value)
  FROM dbo.f_splitstr(@id1s) Desk_id, dbo.f_splitstr(@id2s) room_id, dbo.f_splitstr(@dates) terminate_time
  WHERE Desk_id.id = room_id.id
      AND Desk_id.id = terminate_time.id
  ) B
  WHERE A.Desk_id = B.ID1 AND A.room_id = B.ID2
  GO这个还用到一个函数f_splitstr
  CREATE FUNCTION dbo.f_splitstr(
      @str varchar(8000)
  )RETURNS @r TABLE(id int IDENTITY(1, 1), value varchar(5000))
  AS
  BEGIN
      DECLARE @pos int
      SET @pos = CHARINDEX(',', @str)
      WHILE @pos > 0
      BEGIN
          INSERT @r(value) VALUES(LEFT(@str, @pos - 1))
          SELECT
              @str = STUFF(@str, 1, @pos, ''),
              @pos = CHARINDEX(',', @str)
      END
      IF @str > ''
          INSERT @r(value) VALUES(@str)
      RETURN
  END

  
  方法三 xml
  
  应该用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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-82646-1-1.html 上篇帖子: 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 下篇帖子: Microsoft SQL Server及SQL Server 2000 Driver for JDBC安装与配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表