Возвращаемое SSIS значение хранимой процедуры в команде OLE DB

Я переношу данные, которые нужно вставить, используя уже существующие хранимые процедуры. У хранимых процедур есть параметры и возвращаемое значение (из оператора select) идентификатора для вставленной строки. В команде OLE DB в SSIS я могу вызвать хранимую процедуру, передавая значения столбцов в качестве параметров, и я обычно использую выходные параметры хранимой процедуры для обработки вывода «id»; но я не уверен, как это можно обработать с возвращаемыми значениями, когда процедура использует выбор для возврата значения идентификатора. Вот пример того, что я использовал раньше, что работает, но мне нужно получить значение, возвращаемое из выбора:

exec dbo.uspInsertContactAddress
@Address = ?,
@ContactID = ?,
@DeliveryMethodId = ?,
@ID = ? output,
@Version = ? output

person bobwah    schedule 28.01.2009    source источник


Ответы (4)


Я обнаружил, что могу это сделать, что на самом деле было довольно просто:

exec ? = dbo.StoredProc @param = ?, @param2 = ?

а затем @RETURN_VALUE появится в доступных столбцах назначения.

person bobwah    schedule 04.02.2009
comment
Мне нужно было использовать имя параметра 0 в разделе сопоставлений параметров (sql313.com/index.php/39-main-blogs/maincat-dba/) - person Mark Sowul; 17.10.2019

Не используйте имена переменных в свойстве SqlCommand, используйте только вопросительные знаки и метку "OUT" или "OUTPUT" для выходных параметров.

Хитрость получения значения выходного параметра заключается в том, чтобы поместить производное преобразование столбца в конвейер перед командой OLE DB, чтобы ввести столбец (сопоставленный с переменной SSIS) для захвата результата процедуры.

Подробный обзор см. в разделе преобразование команд OLEDB и столбцы идентификаторов. с шапками экрана, как это сделать. Также см. Адаптер назначения корзины, чтобы узнать о назначении корзины, используемом в первой ссылке. Это удобный инструмент для отладки подобных вещей.

person John Mo    schedule 28.01.2009
comment
Спасибо за ответ, хотя, возможно, я не объяснил в своем вопросе, что именно мне нужно сделать. Вышеприведенный код, который я использовал, работает, и я могу получить значения, если у процедуры есть выходной параметр. Проблема в том, что процедуры, используемые для этой базы данных, просто вызывают выбор для получения значения. - person bobwah; 29.01.2009
comment
Извините, я не уверен, что понимаю, в чем проблема. Дело в том, что вы не передаете результат выбора через выходной параметр, и вместо этого вам нужен способ получить набор результатов процесса? - person John Mo; 29.01.2009

Если хранимая процедура возвращает набор результатов, вам необходимо его зафиксировать:

DECLARE @results TABLE (
    [ID] INT NOT NULL
)

INSERT @results ([ID])
EXEC dbo.uspInsertContactAddress @Address = ?, @ContactID = ?, @DeliveryMethodId = ?, @ID = ? output, @Version = ? output

SELECT * FROM @results 

Примечание. Я использовал переменную TABLE. В зависимости от версии SQL Server вам может понадобиться использовать временную таблицу.

person beach    schedule 29.01.2009

Я всегда успешно использовал сопоставление параметров в задаче «Выполнение SQL». Оператор SQL имеет вид «EXEC nameofstoredproc ?, ? OUTPUT» с вопросительными знаками, указывающими расположение параметров и OUTPUT, если параметр является выходным.

Вы указываете параметры в сопоставлении с соответствующим именем переменной, направлением (ввод, вывод, возвращаемое значение) и типом данных. Поскольку ваш хранимый процесс возвращает нужные вам данные через набор результатов, укажите направление для переменных для сбора идентификатора и версии как ReturnValue. Это должно хорошо работать для вас.

person Community    schedule 29.01.2009