sql - 如何使用 CURSOR 更新 SQL 中的多行?
问题描述
下面是我正在尝试但没有工作的 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
解决方案
我了解您想要更新原始表,将每个表替换sampId
为输入 csv 列表中的每个相应索引。
SQL Server中没有split()
函数。您不能使用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
推荐阅读
- java - 如何让我的方法计算主 char 数组中“a”的字符?
- swift - 不向 Firebase 添加用户
- redhat - Liquid 参考在 3Scale 开发人员门户中创建的新页面中不起作用?
- javascript - Event.target.ParentNode() 正在考虑所有先前交互的目标元素
- r - 将 glmnet 从二项式更改为多项式会出错
- swagger - 对象作为开放 API 规范 Swagger 上 API 中的查询字符串参数
- javascript - 从 for 循环中保存数据
- python - 将变量放入用户名和密码身份验证?
- javascript - 使用 jsPDF 将 Div 的内容下载为 PDF
- python - 如何直观地调整 3D 图像的大小