Разделить строку с помощью String_Split () в SQL Server 2016 - PullRequest
0 голосов
/ 23 октября 2018

Мне нужно использовать 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 для преобразования данных таблицы этапов и вставки в итоговую таблицу.Столбец Код в таблице этапов является строкой, а «_» используется в качестве разделителя.Мне нужно отделить строку и отобразить итоговую таблицу, как показано ниже

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

Но он разбивает только одну строку за раз, так как мои сценические данные содержат миллионы записей, мне нужно разбить всю строку в столбце кода и сохранить в соответствующем столбце.

Примечание: я не хочуиспользовать временную таблицу.

спасибо

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Как и @ 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];
0 голосов
/ 24 октября 2018

Поскольку в принятом ответе используется TOKEN(), который связан с SSIS, я хочу также предоставить решение SQL-Server.

Вы используете v2016, который допускает OPENJSON.Когда вы используете это в JSON-массиве, вы получите столбец [ключ], указывающий позицию в массиве, и столбец [значение], предоставляющий фактическое содержимое.

Преобразовать 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
0 голосов
/ 23 октября 2018

Вы можете добавить производный столбец и, предполагая, что формат состоит из того, что вы перечислили, используйте функцию TOKEN, чтобы разделить входные данные на основе разделителя "_" и положения каждой строки.Отсюда вы можете отобразить каждый из выходов в соответствующий столбец назначения.Три приведенных ниже утверждения разделяют столбец кода на основе данных примера в вашем вопросе.Обратите внимание, что тип выходных данных TOKEN - DT_WSTR (Unicode).Если вам нужны данные не в Юникоде, вам придется привести их обратно к DT_STR, что также можно сделать в том же производном столбце, добавив (DT_STR,50,1252) (при необходимости измените длину) перед каждым оператором.

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