【问题标题】:Split the string using String_Split() in SQL Server 2016在 SQL Server 2016 中使用 String_Split() 拆分字符串
【发布时间】:2019-03-27 20:02:51
【问题描述】:

我需要在我的阶段表中使用STRING_SPLIT 并将结果导入另一个表。

舞台表:

DECLARE @stage TABLE(ID INT, Code VARCHAR(500))

INSERT INTO @stage
    SELECT 1, '123_Potato_Orange_Fish' 
    UNION ALL
    SELECT 2, '456_Tomato_Banana_Chicken' 
    UNION ALL
    SELECT 3, '789_Onion_Mango_Lamb' 

决赛桌:

DECLARE @Final TABLE
               (
                    ID INT, 
                    code VARCHAR(500),
                    Unit VARCHAR(100),
                    Vegetable VARCHAR(100),
                    Fruit VARCHAR(100),
                    Meat VARCHAR(100)
               )

我正在使用 SSIS 执行任务来转换阶段表数据并插入到最终表中。 stage 表中的 Code 列是字符串,'_' 用于分隔符。我需要分隔字符串并显示最终表格如下所示

ID        code                  Unit    Vegetable   Fruit   Meat
------------------------------------------------------------------
1   123_Potato_Orange_Fish      123      Potato    Orange   Fish
2   456_Tomato_Banana_Chicken   456      Tomato    Banana   Chicken
3   789_Onion_Mango_Lamb        789      Onion     Mango    Lamb

我正在尝试使用 SQL Server 2016 内置的String_Split() 函数,如下所示:

SELECT 
    ID,
    Code, f.value AS Vegetable 
FROM 
    @stage AS s
CROSS APPLY
    (SELECT 
         value,
         ROW_NUMBER() OVER(PARTITION BY s.ID ORDER BY s.ID) AS rn 
     FROM
         String_Split(s.Code, '_')) AS f
WHERE 
    s.ID = 1 AND f.rn = 2

但它一次只拆分一个字符串,因为我的阶段数据包含数百万条记录,我需要拆分代码列中的所有字符串并存储在相应的列中。

注意:我不想使用临时表。

谢谢

【问题讨论】:

  • STRING_SPLIT() - 为什么会 - 不保证按给定顺序返回片段。但是有OPENJSON,看我的回答...

标签: tsql ssis split delimiter sql-server-2016


【解决方案1】:

您可以添加派生列并假设格式与您列出的内容一致,使用TOKEN 函数根据"_" 分隔符和每个字符串的位置拆分输入。从这里,您可以将每个输出映射到适当的目标列。下面的三个语句根据您问题中的示例数据拆分您的代码列。请注意,TOKEN 的输出数据类型是DT_WSTR (Unicode)。如果您需要非 Unicode 数据,则必须将其转换回 DT_STR,这也可以通过在每个语句前添加 (DT_STR,50,1252)(根据需要调整长度)在同一派生列中完成。

  • TOKEN(Code,"_",1)
  • TOKEN(Code,"_",2)
  • TOKEN(Code,"_",3)

【讨论】:

  • 感谢您的解决方案。
  • 这对我来说是个新闻。我想我已经用另一种方式做了很长时间了,我懒得去学习
【解决方案2】:

像@userfl89 一样,这里是另一个使用脚本组件的 SSIS 解决方案: 将 4 个输出列添加到您的 output0。确保在输入列中选择代码。

string[] col = Row.Code.ToString().Split('_');

Row.Unit = Int.Parse(col[0]);
Row.Vegetable = col[1];
Row.Fruit = col[2];
Row.Meat = col[3];

【讨论】:

    【解决方案3】:

    由于接受的答案使用绑定到 SSIS 的TOKEN(),因此我也想提供一个 SQL-Server 解决方案。

    您使用的是 v2016,它允许 OPENJSON。当你在 JSON 数组上使用它时,你会得到一个列 [key] 指示数组中的位置,以及一个列 [value] 提供实际内容。

    将 CSV 字符串转换为 JSON 数组非常容易。其余的以 条件聚合 为中心。试试看:

    DECLARE @stage TABLE(ID INT, Code VARCHAR(500))
    
    INSERT INTO @stage
        SELECT 1, '123_Potato_Orange_Fish' 
        UNION ALL
        SELECT 2, '456_Tomato_Banana_Chicken' 
        UNION ALL
        SELECT 3, '789_Onion_Mango_Lamb' 
    
    SELECT ID 
          ,Code
          ,MAX(CASE WHEN [key]=0 THEN CAST([value] AS INT) END) AS Unit
          ,MAX(CASE WHEN [key]=1 THEN [value] END) AS Vegetable
          ,MAX(CASE WHEN [key]=2 THEN [value] END) AS Fruit
          ,MAX(CASE WHEN [key]=3 THEN [value] END) AS Meat
    FROM @stage
    CROSS APPLY OPENJSON('["' + REPLACE(Code,'_','","') + '"]') A
    GROUP BY ID,Code
    

    【讨论】:

      猜你喜欢
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多