在 SQL Server 2016 中使用 String_Split() 拆分字符串

Split the string using String_Split() in SQL Server 2016

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

阶段table:

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' 

决赛 table:

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

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

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

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

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

谢谢

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

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

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

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

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

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

您使用的是 v2016,允许 OPENJSON。当你在 JSON-array 上使用它时,你会得到一个列 [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