【问题标题】:Combine string_split column results in table SQL在表 SQL 中组合 string_split 列结果
【发布时间】:2019-09-21 17:05:16
【问题描述】:

我正在尝试创建一个用于批量更新表的存储过程。我想将参数作为nvarchar 传入并在它们上调用string_split

@ParamList1 NVARCHAR(max) = '1,2,3,4,5'
@ParamList2 NVARCHAR(max) = 'a,b,c,d,e'

我想要一个临时表,比如

Param1  Param2
1       a
2       b
3       c
...

我该怎么做?

【问题讨论】:

    标签: sql-server tsql join split


    【解决方案1】:

    很遗憾,string_split() 不保证排序或提供位置参数(Microsoft 你在听吗?)。

    因此,最安全的方法是递归 CTE(或者可能是另一种使用 XML 的方法):

    with cte as (
          select convert(nvarchar(max), NULL) as x1, convert(nvarchar(max), NULL) as x2, @paramlist1 as rest1, @paramlist2 as rest2, 1 as lev
          union all
          select convert(nvarchar(max), left(rest1, charindex(',', rest1 + ',') - 1)),
                 convert(nvarchar(max), left(rest2, charindex(',', rest2 + ',') - 1)),
                 stuff(rest1, 1, charindex(',', rest1 + ','), ''),
                 stuff(rest2, 1, charindex(',', rest2 + ','), ''),
                 lev + 1
          from cte
          where rest1 <> '' and rest2 <> ''
         )
    select *
    from cte
    where x1 is not null;
    

    Here 是一个 dbfiddle。

    【讨论】:

    • 哇,太好了,谢谢。以前从未听说过相关子查询。
    • “lev
    • @Benny。 . . (1) 这是一个递归 CTE。我不敢相信我的手指输入了别的东西。 (2) lev 上的比较只是我在测试递归 CTE 时经常放入的东西。我删除了它。
    • 因为 STRING_SPLIT() 需要 v2016+,所以 OPENJSON 作为类型安全和位置安全的字符串拆分器。你可以read this (UPDATE sections)
    【解决方案2】:

    你已经得到了答案,它工作正常,但这应该更快更容易:

    您没有指定 SQL-Server 的版本,但是 - 谈到 STRING_SPLIT() - 我认为它至少是 v2016。如果这是正确的,您可以使用 OPENJSON。您的数字列表只需要括号就可以成为 JSON 数组 ([1,2,3]),而单词/字母数组可以通过一些简单的字符串操作 (["a","b","c"]) 进行转换。

    按照文档,OPENJSON 在[key] 中返回元素位置,而元素本身在[value] 中返回。您可以简单地加入这些集合:

    DECLARE @ParamList1 NVARCHAR(max) = '1,2,3,4,5';
    DECLARE @ParamList2 NVARCHAR(max) = 'a,b,c,d,e';
    
    SELECT p1.[key] AS FragmentNr
          ,p1.[value] AS P1
          ,p2.[value] AS P2
    FROM OPENJSON(CONCAT('[',@ParamList1 + ']')) p1
    INNER JOIN OPENJSON(CONCAT('["',REPLACE(@ParamList2,',','","'),'"]')) p2 ON p1.[key]=p2.[key] ;
    

    this answer 中,您会找到一些详细信息(更新第 1 和第 2 部分)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 2015-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      相关资源
      最近更新 更多