Служба SSIS выполняет хранимую процедуру с параметрами из CSV-файла SQL Server 2005 - PullRequest
1 голос
/ 22 сентября 2010

Я изучаю SSIS, и это кажется легкой задачей, но я застрял.

У меня есть файл CSV Orders.csv с этими данными:

ProductId,Quantity,CustomerId
1,1,104
2,1,105
3,2,106

У меня также есть хранимая процедура ssis_createorder, которая принимает в качестве входных параметров: @productid int @quantity int @customerid int

Что я хочу сделать, так это создать пакет служб SSIS, который принимает файл .csv в качестве входных данных и трижды вызывает ssis_createorder для каждой строки в файле .csv (первая строка содержит имена столбцов).

Вот что я сделал до сих пор.

Я создал пакет служб SSIS (Visual Studio 2005 и SQL Server 2005).

В потоке управления у меня есть задача потока данных.

Поток данных имеет источник плоского файла моего файла .csv. Все столбцы сопоставлены.

Я создал переменную с именем orders типа Object. У меня также есть переменные CustomerId, ProductId и количество типа int32.

Далее у меня есть пункт назначения набора записей, который назначает содержимое файла .csv в порядке varialbe. Я не уверен, как использовать этот инструмент. Я устанавливаю VariableName (в разделе «Свойства клиента») для User :: orders. Я думаю, что теперь orders содержит набор записей ADO, составленный из содержимого исходного файла .csv.

Далее я добавляю контейнер цикла ForEach в тег потока управления и связываю его с задачей потока данных.

Внутри контейнера циклов ForEach я устанавливаю для Enumerator значение «ForEach ADO Enumerator». Я устанавливаю "переменную источника объекта ADO" в User :: orders ". Для режима перечисления я выбираю" Rows in the first table ".

На вкладке «Сопоставление переменных» у меня есть User :: ProductId index 0, User :: Количественный индекс 1, User :: CustomerId index 2. Я не уверен, правильно ли это.

Далее у меня есть задача сценария внутри контейнера цикла ForEach.

У меня для ReadOnlyVariables установлено значение ProductId.

В методе Main это то, что я делаю:

 Dim sProductId As String = Dts.Variables("ProductId").Value.ToString

 MsgBox("sProductId")

Когда я запускаю пакет, мой контейнер цикла ForEach становится ярко-красным, и я получаю следующие сообщения об ошибках

Error: 0xC001F009 at MasterTest: The type of the value being assigned to variable "User::ProductId" differs from the current variable type. Variables may not change type during execution. Variable types are strict, except for variables of type Object.
Error: 0xC001C012 at Foreach Loop Container: ForEach Variable Mapping number 1 to variable "User::ProductId" cannot be applied.
Error: 0xC001F009 at MasterTest: The type of the value being assigned to variable "User::Quantity" differs from the current variable type. Variables may not change type during execution. Variable types are strict, except for variables of type Object.
Error: 0xC001C012 at Foreach Loop Container: ForEach Variable Mapping number 2 to variable "User::Quantity" cannot be applied.
Error: 0xC001F009 at MasterTest: The type of the value being assigned to variable "User::CustomerId" differs from the current variable type. Variables may not change type during execution. Variable types are strict, except for variables of type Object.
Error: 0xC001C012 at Foreach Loop Container: ForEach Variable Mapping number 3 to variable "User::CustomerId" cannot be applied.
Warning: 0x80019002 at MasterTest: SSIS Warning Code DTS_W_MAXIMUMERRORCOUNTREACHED.  The Execution method succeeded, but the number of errors raised (12) reached the maximum allowed (1); resulting in failure. This occurs when the number of errors reaches the number specified in MaximumErrorCount. Change the MaximumErrorCount or fix the errors.
SSIS package "Package.dtsx" finished: Failure.
     Dts.TaskResult = Dts.Results.Success

Любая помощь будет оценена

Ответы [ 4 ]

6 голосов
/ 22 сентября 2010

Один из моих коллег просто дал мне ответ.

Вам не нужен контейнер цикла ForEach или контейнер RecordSet.

Все, что вам нужно, это источник плоских файлов и команда OLE DB.Соединитесь с вашей базой данных и внутри команды OLE DB выберите соответствующее соединение.

В свойствах компонента введите следующий SQLCommand:

exec ssis_createorder ?, ?, ? 

"?"являются заполнителями для параметров.

Далее на вкладке Сопоставления столбцов сопоставьте столбцы файла .csv с параметрами хранимой процедуры.

Вы закончили и запустите пакет.

Спасибо, Гэри, если бы вы были на StackOverFlow, я бы вам ответил и принял ваш ответ.

2 голосов
/ 22 сентября 2010

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

Что если вы просто создадите поток данных с источником данных в виде плоского файла и передадите данные через 3 команды запуска SQL?Просто сопоставьте столбцы в данных с входными параметрами вашей хранимой процедуры.

Возможно, я не вижу его правильно в вашем вопросе, и я думаю, что слишком просто, но по моему опыту вам нужно как можно больше избегать использования задачи foreach в SSIS.

1 голос
/ 27 августа 2012

Я не уверен, что это ответит на ваш вопрос.Но я хотел сделать это и достиг этого с помощью команды BULK INSERT.Я создал промежуточную таблицу со всеми столбцами в CSV-файле и вместо хранимой процедуры использовал триггер INSTEAD OF INSERT для обработки логики вставки ее во многие таблицы.

1 голос
/ 22 сентября 2010

Я подозреваю, что вам нужно взглянуть на задачу Data Flow.Вероятно, что значения из исходного CSV-файла интерпретируются как строковые значения.Вам, вероятно, понадобится компонент «Производный столбец» или компонент «Преобразование данных» для преобразования ваших входных значений в нужный тип данных.

И, я думаю, решение @ StephaneT было бы хорошо для выполнения SP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...