我有一个包含3列的表:col1、col2、col3。我需要在这个表中插入行,我的输入是3个参数,一个int param和两个需要拆分的varchar param。例如
@param1 = 1
@param2 = '2,3'
@param3 = '4,5'
要生成的行是
1,2,4
1,3,5
我试图用这样的代码接近期望的结果
WITH group1 AS (
SELECT @param1 as col1, value as col2 from string_split(@param2,',')
),
group2 AS (
SELECT @param1 as col1, value as col3 from string_split(@param3,',')
)
SELECT group1.col1, group1.col2, group2.col3
FROM group1
JOIN group2 ON group1.col1 = group2.col1
但这并不是我想要的。
您需要一个拆分器,它返回每个子字符串和子字符串的位置。有时,基于JSON的方法可能会有所帮助。您需要将逗号分隔的字符串转换为有效的JSON数组(2,3
转换为[2,3]
(,使用OPENJSON()
解析数组,并使用适当的JOIN
:
DECLARE @param1 int = 1
DECLARE @param2 varchar(100) = '2,3,6,8'
DECLARE @param3 varchar(100) = '4,5,9,5'
-- INSERT INTO Table1 (Column1, Column2, Column3)
SELECT
@param1 AS Column1,
j1.[value] AS Column2,
j2.[value] AS Column3
FROM OPENJSON (CONCAT('[', @param2, ']')) j1
FULL JOIN OPENJSON (CONCAT('[', @param3, ']')) j2 ON j1.[key] = j2.[key]
结果:
Column1 Column2 Column3
1 2 4
1 3 5
1 6 9
1 8 5
作为一个重要的注意事项(尽管STRING_SPLIT()
将字符串拆分为行并返回一个表(,正如文档中所提到的,输出行可以是任何顺序,并且的顺序不能保证与输入字符串中子字符串的顺序相匹配。