SSIS Задача потока данных выполняется сама по себе, но не как часть пакета
У меня есть пакет dtsx, который содержит кучу потоков данных.
Все они выбирают строки из таблицы, каждая из строк содержит столбец с некоторым JSON, есть компонент сценария (C#), который десериализует JSON, а затем место назначения данных, которое загружает данные в некоторые буферные таблицы.
Один из самых простых сценариев, который имеет дело с каким-то действительно простым JSON, прекрасно работает сам (Правый клик -> Выполнить задачу или когда все другие задачи отключены), однако, когда я пытаюсь запустить пакет в целом, этот пакет падает с сообщение об ошибке
Индекс находился вне границ массива. на ScriptMain.Input0_ProcessInputRow(Input0Buffer Row) в UserComponent.Input0_ProcessInput(Input0Buffer буфера) при UserComponent.ProcessInput(Int32 InputID, струнного InputName, PipelineBuffer буфера, OutputNameMap OutputMap) при Microsoft.SqlServer.Dts.Pipeline.ScriptComponent.ProcessInput(Int32 InputID, PipelineBuffer буфер) в Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.ProcessInput(Int32 inputID, буфер PipelineBuffer)
JSON выглядит так...
{
"token": "0b683877-81d6-4dhs-a1ad-9fcfff6acb61",
"email": "someone@gmail.com"
}
и C#, как это
public class RootAttributes
{
public string token { get; set; }
public string email { get; set; }
}
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
String myEvtData = System.Text.Encoding.Unicode.GetString(Row.evtdata.GetBlobData(0, Convert.ToInt32(Row.evtdata.Length)));
JavaScriptSerializer js = new JavaScriptSerializer();
RootAttributes jRow = js.Deserialize<RootAttributes>(myEvtData);
//DB Output
Output0Buffer.AddRow();
Output0Buffer.country = Row.country;
Output0Buffer.ord = Row.ord;
Output0Buffer.aggregateversion = Row.aggregateversion;
Output0Buffer.clienttype = Row.clienttype;
Output0Buffer.aggregateid = Row.aggregateid;
Output0Buffer.updby = Row.updby;
Output0Buffer.evttimestamp = Row.evttimestamp;
//JSON Output
Output0Buffer.token = jRow.token;
Output0Buffer.email = jRow.email;
}
У меня есть второй скрипт - практически идентичный, который также не работает с тем же сообщением об ошибке. Я пробовал запускать их как один за другим, так и независимо - то есть все DF одновременно.
Пожалуйста помоги
Спасибо
Майк
2 ответа
Если вы просто добавляете эти два столбца, то вам не нужно:
//DB Output
Output0Buffer.AddRow();
Output0Buffer.country = Row.country;
Output0Buffer.ord = Row.ord;
Output0Buffer.aggregateversion = Row.aggregateversion;
Output0Buffer.clienttype = Row.clienttype;
Output0Buffer.aggregateid = Row.aggregateid;
Output0Buffer.updby = Row.updby;
Output0Buffer.evttimestamp = Row.evttimestamp;
Просто добавьте два столбца в Output0Buffer.
Вам просто нужно проверить один столбец с JSON на средней странице.
В конечном итоге это было связано с копированием задач потока данных из одного пакета в другой. Я не уверен на 100%, в чем причина, но копирование не было идеальным, и ДФ, похоже, заражали друг друга.
Я нашел решение здесь
https://kohera.be/blog/sql-server/the-dangers-of-copying-script-components-in-ssis/