如何使用游标更新sql中的多行?

j91ykkif  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(384)

下面是我的sql更新,我正在尝试,但没有工作。但是当使用@sampids作为int数据类型时,它对单记录整数更新有效。任何帮助都将不胜感激。谢谢

DECLARE @sampids AS NVARCHAR(1000)='10,20,30'   
DECLARE @sampcursorno AS INT=0

DECLARE sample_cursor CURSOR FOR
SELECT VALUE FROM Split(@sampids,',')
OPEN sample_cursor
FETCH NEXT FROM sample_cursor INTO @sampcursorno

WHILE @@FETCH_STATUS = 0
    BEGIN   

        UPDATE tbl_Testing
        SET SampId = @sampcursorno

        FETCH NEXT FROM sample_cursor INTO @sampcursorno

    END

CLOSE sample_cursor

DEALLOCATE sample_cursor
5kgi1eie

5kgi1eie1#

我知道您想更新原始表,替换每个表 sampId 输入csv列表中的每个索引。
根本没有 split() sql server中的函数。你不能使用 string_split() ,因为它不能保证零件的退货顺序。
一种方法是使用递归查询拆分输入字符串,然后使用生成的数据集进行更新:

declare @sampids as nvarchar(1000)='10,20,30';

with cte as (
    select 
        1 id,
        cast(substring(@sampids, 1, charindex(',', @sampids) - 1) as int) sampid,
        substring(@sampids + ',', charindex(',', @sampids) + 1, len(@sampids)) rest
    union all
    select 
        id + 1,
        cast(substring(rest, 1, charindex(',', rest) - 1) as int),
        substring(rest, charindex(',', rest) + 1, len(rest))
    from cte
    where charindex(',', rest) > 0
)
update t
set sampid = c.id
from tbl_Testing t
inner join cte c on c.sampid = t.sampid

相关问题