如何通过单条INSERT语句插入多组拆分后的字符串数据
实现逗号分隔字符串对应插入临时表的方法
嘿,这个需求其实挺常见的——咱们要把三个按位置一一对应的逗号分隔字符串拆分后,精准插入临时表的对应字段对吧?下面分两种情况给你解决方案,适配不同版本的SQL Server:
方法一:适用于SQL Server 2016及以上(兼容范围广)
咱们可以用OPENJSON来拆分字符串,它会返回每个元素的位置索引(key字段),刚好能用来关联三个变量里的对应元素:
Declare @APS nvarchar(1000)='1,1,1.79103540163304,1.79103540163304' , @cluster nvarchar(1000)='0150,0019,0150,0019' , @style nvarchar(1000)='696707-018,696707-018,696707-017,696707-017' CREATE TABLE #temptable ( ID int IDENTITY (1, 1) NOT NULL , stylecolor varchar (500) NOT NULL , APSDev varchar (250) NULL, ClusterID varchar(1000) Null ) -- 核心插入逻辑 INSERT INTO #temptable (stylecolor, ClusterID, APSDev) SELECT s.value AS stylecolor, c.value AS ClusterID, a.value AS APSDev FROM -- 把逗号分隔字符串转成JSON数组格式,让OPENJSON能解析 OPENJSON('["' + REPLACE(@style, ',', '","') + '"]') s -- 通过key(元素位置)关联三个拆分后的结果,保证位置对应 JOIN OPENJSON('["' + REPLACE(@cluster, ',', '","') + '"]') c ON s.[key] = c.[key] JOIN OPENJSON('["' + REPLACE(@APS, ',', '","') + '"]') a ON s.[key] = a.[key] -- 可以查一下结果是否正确 SELECT * FROM #temptable
原理说明
REPLACE(@style, ',', '","')是把696707-018,696707-018...转换成696707-018","696707-018...,再加上前后的["和"]就变成了标准的JSON数组,OPENJSON解析后会返回每个元素的key(从0开始的位置序号)和value(元素内容),通过key相等关联,就能确保三个变量里的第N个元素对应插入同一条记录。
方法二:适用于SQL Server 2022及以上(更简洁)
SQL Server 2022给STRING_SPLIT加了enable_ordinal参数,直接返回元素的序号(ordinal字段),代码会更清爽:
-- 变量和临时表定义和之前一致,此处省略重复代码 INSERT INTO #temptable (stylecolor, ClusterID, APSDev) SELECT s.value AS stylecolor, c.value AS ClusterID, a.value AS APSDev FROM STRING_SPLIT(@style, ',', 1) s -- 通过ordinal(元素序号)关联,保证位置对应 JOIN STRING_SPLIT(@cluster, ',', 1) c ON s.ordinal = c.ordinal JOIN STRING_SPLIT(@APS, ',', 1) a ON s.ordinal = a.ordinal
注意事项
- 要确保三个变量里的元素数量完全一致,不然用
JOIN会丢失不匹配的行;如果需要保留所有元素(哪怕数量不一致),可以把JOIN换成FULL JOIN,然后处理NULL值。 - 如果你的字符串里有特殊字符(比如双引号),需要先做转义处理,避免JSON解析出错。
内容的提问来源于stack exchange,提问作者sravas
相关产品推荐
相关产品推荐

