在 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
我需要在我的阶段 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