SSIS возвращает значение хранимой процедуры в команде OLE DB
-
20-08-2019 - |
Вопрос
Я переношу данные, которые должны быть вставлены, используя хранимые процедуры, которые уже существуют.Хранимые процедуры имеют параметры и возвращаемое значение (из инструкции select) идентификатора для вставленной строки.В рамках команды OLE DB в SSIS я могу вызвать хранимую процедуру, передающую значения столбцов в качестве параметров, и я обычно использую выходные параметры в хранимой процедуре для обработки выходных данных "id";но я не уверен, как это можно обработать с возвращаемыми значениями, когда процедура использует select для возврата значения id.Вот пример того, что я использовал раньше, которое работает, но мне нужно выбрать значение, возвращенное из select:
exec dbo.uspInsertContactAddress
@Address = ?,
@ContactID = ?,
@DeliveryMethodId = ?,
@ID = ? output,
@Version = ? output
Решение
Я обнаружил, что могу это сделать, что на самом деле было довольно просто:
exec ? = dbo.StoredProc @param = ?, @param2 = ?
и тогда @RETURN_VALUE появится в Доступных столбцах назначения
Другие советы
Не используйте имена переменных в свойстве SqlCommand, только вопросительные знаки и метки "OUT" или "OUTPUT" для выходных параметров.
Хитрость для захвата значения выходного параметра заключается в том, чтобы поместить производное преобразование столбца в конвейер перед командой OLE DB, чтобы ввести столбец (сопоставленный переменной SSIS) для захвата результата процедуры.
Видишь Преобразование команд OLEDB И столбцы идентификаторов для получения хорошего обзора с заглавными буквами экрана о том, как это сделать.Также смотрите Адаптер для отправки мусора для назначения корзины, используемого в первой ссылке.Это удобный инструмент для отладки подобных вещей.
Если хранимая процедура возвращает результирующий набор, то вам необходимо его зафиксировать:
DECLARE @results TABLE (
[ID] INT NOT NULL
)
INSERT @results ([ID])
EXEC dbo.uspInsertContactAddress @Address = ?, @ContactID = ?, @DeliveryMethodId = ?, @ID = ? output, @Version = ? output
SELECT * FROM @results
Примечание:Я использовал табличную переменную.Возможно, вам потребуется использовать временную таблицу в зависимости от вашей версии SQL Server.
Я всегда с большим успехом использовал сопоставление параметров в рамках задачи Execute SQL.Инструкция SQL - это "EXEC nameofstoredproc ?, ?ВЫВОД", с вопросительными знаками, указывающими расположение параметров и вывод, если параметр является выводом.
Вы указываете параметры в сопоставлении с соответствующим именем переменной, направлением (ввод, вывод, возвращаемое значение) и типом данных.Поскольку ваша сохраненная процедура возвращает нужные вам данные через результирующий набор, затем укажите направление для переменных для сбора идентификатора и версии в качестве возвращаемого значения.У вас это должно сработать просто отлично.