Проблема с производным столбцом SSIS

#sql #ssis

Вопрос:

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

 1 - xxx,xxxx,xxx,xxxxx,xxx
2 - xxxxx,xxxx,xxxx,xxxxxx
 

Из источника OLEDB я добавил производный столбец, назвал его чем-то и добавил как новый столбец, затем я попытался добавить выражение SUBSTRING( [column] , 1, FINDSTRING( [column] , ",",1 )-1 )
, и я продолжаю получать ошибку;

 Error at Load Stg data into Table [SSIS.Pipeline]: The "Derived Column.Outputs[Derived Column Output].Columns[Insurer]" has a length that is not valid. The length must be between 0 and 4000.

Error at Load Stg data into Table [Derived Column [207]]: Failed to set the type of Derived Column.Outputs[Derived Column Output].Columns[Insurer] to type: "DT_WSTR", length: 6000, precision: 0, scale: 0, codepage: 0.

Error at Load Stg data into Table [Derived Column [207]]: Failed to set property "Expression" on "Derived Column.Outputs[Derived Column Output].Columns[Insurer]".



------------------------------
ADDITIONAL INFORMATION:

Exception from HRESULT: 0xC0204006 (Microsoft.SqlServer.DTSPipelineWrap)
 

Я попытался использовать расширенный редактор, чтобы изменить длину столбца, тип данных, но все равно получил ошибку.
Каждая строка данных имеет разную длину, поэтому я не могу жестко указать длину каждой части данных в столбце. Я использую VS 2017.

Ответ №1:

Что здесь не так?

Учитывая настройку, задача производного столбца смогла правильно определить начальную длину и тип DT_WSTR 26.

Однако предоставленное вами сообщение об ошибке указывает на то, что у вас есть данные, которые не соответствуют этому ожиданию

DT_WSTR», длина: 6000

Строка в службах SSIS имеет максимальную длину 4000 символов. Если вам нужна строка, которая больше, чем в потоке данных, она будет введена в тип потока/большого объекта (DT_NTEXT).

То, что вы предоставили, работает, поэтому проблема заключается в ваших фактических данных.

Источник

Простой запрос для ввода ваших выборочных данных в поток.

 SELECT
*
FROM
(
    VALUES
        ('1 - xxx,xxxx,xxx,xxxxx,xxx')
    ,   ('2 - xxxxx,xxxx,xxxx,xxxxxx')
)D(mycolumn)
 

Сначала ДЕР раскололся

Выражение, как указано (с column переименованием, как mycolumn на шаге 1)

 SUBSTRING(mycolumn,1,FINDSTRING(mycolumn,",",1) - 1)
 

Результаты

Данные от начала до первой запятой, правая конечная точка не включает

введите описание изображения здесь

Комментарии:

1. Таким образом, потенциально длина данных в таблице может быть проблемой здесь?

2. Это было бы моим предположением, основанным на сообщении об ошибке и том факте, что упрощенный пример показывает, что у вас правильный синтаксис для измельчения вашей строки. Если усечение допустимо, вы можете взять правильные 4000 символов RIGHT(SUBSTRING(mycolumn,1,FINDSTRING(mycolumn,",",1) - 1), 4000)