合并 string_split 操作的结果并更新 table

Merge results of string_split operations and update table

我有一个包含 3 列的 table:col1、col2、col3。我需要在此 table 中插入行,我的输入是 3 个参数,一个 int 参数和两个我需要拆分的 varchar 参数。例如

@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 

但这不是我想要的。

您需要一个拆分器,即 returns 每个子字符串和子字符串的位置。有时 JSON-based 方法可能会有所帮助。您需要将 comma-separated 字符串转换为有效的 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() 将字符串拆分为行和 returns 一个 table),如 documentation 中所述 输出行可能是任何顺序,并且顺序不能保证与输入字符串中子字符串的顺序相匹配