TSQL中拆分分隔字符串并循环更新表字段的实现方法
TSQL拆分逗号分隔字符串并循环更新表字段
方法一:使用WHILE循环实现
针对你的需求,我们可以通过WHILE循环逐步拆分字符串,提取每个obj_name:version键值对,再拆分出对象名和版本号,最后执行更新操作。以下是完整的TSQL代码:
DECLARE @source VARCHAR(500) DECLARE @tempStr VARCHAR(100) DECLARE @objName VARCHAR(50) DECLARE @version INT DECLARE @commaPos INT SET @source = 'employee:0,dept:1' -- 循环处理直到字符串为空 WHILE LEN(@source) > 0 BEGIN -- 找到第一个逗号的位置,分割出单个键值对 SET @commaPos = CHARINDEX(',', @source) IF @commaPos > 0 BEGIN SET @tempStr = LEFT(@source, @commaPos - 1) SET @source = RIGHT(@source, LEN(@source) - @commaPos) END ELSE BEGIN -- 处理最后一个键值对 SET @tempStr = @source SET @source = '' END -- 拆分obj_name和latest_version的值 SELECT @objName = LEFT(@tempStr, CHARINDEX(':', @tempStr) - 1), @version = CAST(RIGHT(@tempStr, LEN(@tempStr) - CHARINDEX(':', @tempStr)) AS INT) -- 执行更新操作 UPDATE dbo.omega SET latest_version = @version WHERE obj_name = @objName END
代码说明:
- 初始化变量:定义存储源字符串、临时键值对、对象名、版本号和逗号位置的变量。
- 循环拆分:通过
CHARINDEX定位逗号,逐个提取obj_name:version格式的子串,处理后截断源字符串。 - 键值对拆分:再次使用
CHARINDEX定位冒号,分离出对象名和版本号,并将版本号转为INT类型。 - 执行更新:针对每个对象名,更新对应的
latest_version字段。
方法二:使用STRING_SPLIT(SQL Server 2016+)批量更新(更高效)
如果你的SQL Server版本是2016或更高,推荐使用STRING_SPLIT函数结合CROSS APPLY批量处理,避免循环带来的性能损耗:
DECLARE @source VARCHAR(500) = 'employee:0,dept:1' UPDATE o SET o.latest_version = CAST(s2.version AS INT) FROM dbo.omega o JOIN ( -- 拆分逗号分隔的字符串为单个键值对 SELECT value AS kvp FROM STRING_SPLIT(@source, ',') ) s1 -- 拆分键值对为obj_name和version CROSS APPLY ( SELECT LEFT(s1.kvp, CHARINDEX(':', s1.kvp) - 1) AS obj_name, RIGHT(s1.kvp, LEN(s1.kvp) - CHARINDEX(':', s1.kvp)) AS version ) s2 ON o.obj_name = s2.obj_name
代码说明:
- 用
STRING_SPLIT将源字符串拆分为多个obj_name:version行。 - 通过
CROSS APPLY进一步拆分每个行,得到对象名和版本号。 - 用JOIN关联
dbo.omega表,批量更新匹配的记录,比循环效率更高。
内容的提问来源于stack exchange,提问作者Surender Raja
相关产品推荐
相关产品推荐

