Пакет служб SSIS Выполнение SQL динамического задания c SQL (не SP) с несколькими возвратами, но только захват конечной переменной - PullRequest
0 голосов
/ 22 января 2020

У меня есть пакет служб SSIS, который выполняет динамический c SQL. Dynami c SQL иногда будет иметь набор результатов, а иногда нет, но я хочу только захватить COUNT, который является возвращаемым значением в сценарии ниже.

(или я могу использовать C# Script задача выполнить sh это?), я знаю, что могу oop через наборы записей в C#, но у меня не всегда будет 2, есть ли способ определить разницу в наборах результатов по имени или чему-либо, или только по индекс массива в результирующем наборе [x]?

-- These are passed values in SSIS as paramaters
DECLARE @VariablePassedForSelect AS VARCHAR(50) = ?
DECLARE @ScriptToExecute NVARCHAR(MAX) = ?


-- putting return value count from dynamic script into variable
DECLARE @ReturnRowsEffectedA INT

-- this MAY (or may not) return a result set as dynaic code
exec sp_executesql @ScriptToExecute, N'@VariablePassedForSelect BIGINT, @ReturnRowsEffected INT OUTPUT', @VariablePassedForSelect = @VariablePassedForSelect, @ReturnRowsEffected = @ReturnRowsEffectedA OUTPUT

-- now select results for returning,this is only value I want
SELECT @ReturnRowsEffectedA   AS RowCountR

Все это прекрасно работает в SQL и возвращает набор результатов из динамического c SQL и счетчика, но мне нужен только COUNT возвращается в переменную в SSIS.

Если я использую набор результатов, я получаю ошибку для одной строки (из-за динамического c sql может возвращать результаты и считать).

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

Как я могу получить только значение для @ReturnRowsEctedA

1 Ответ

1 голос
/ 24 января 2020

Вы можете сделать это, используя параметр Output. Сначала создайте переменную SSIS, которая будет содержать значение. Я собираюсь использовать имя, которое у вас уже есть, и назвать эту переменную [User::ReturnRowsEffectedA]. Вам не понадобится @ReturnRowsEctedA в реальном запросе. Вы можете сохранить большую часть текста запроса, но замените @ReturnRowsEffectedA в вызове sp_execute на ?, чтобы обозначить, что мы собираемся использовать переменную параметра SSIS. Выполненный вами запрос SQL будет выглядеть следующим образом:

-- These are passed values in SSIS as paramaters
DECLARE @VariablePassedForSelect AS VARCHAR(50) = ?
DECLARE @ScriptToExecute NVARCHAR(MAX) = ?


-- this MAY (or may not) return a result set as dynaic code
exec sp_executesql @ScriptToExecute, N'@VariablePassedForSelect BIGINT, @ReturnRowsEffected INT OUTPUT', @VariablePassedForSelect = @VariablePassedForSelect, @ReturnRowsEffected = ? OUTPUT

Затем в вашем Parameter Mapping вы добавите третью запись (первые два будут вашими входными параметрами, которые подают @VariablePassedForSelect и @ScriptToExecute) , Вы будете использовать [User::ReturnRowsEffectedA] в качестве Variable Name, установить Direction на Output и изменить Parameter Name на 2. Вы можете оставить тип данных равным LONG, а размер - -1.

Я создал пример в своей системе, чтобы проиллюстрировать, как это работает: Вот мой запрос. Я не передаю в сценарий, для простоты. Но он все еще использует входной и выходной параметры. enter image description here

Здесь вы можете видеть, что ResultSet установлено на None: enter image description here

Только Execute SQL Task использует один параметр, поэтому Parameter Name здесь 0. enter image description here

Я приостановил выполнение после завершения задачи, чтобы вы могли видеть, что [User::ResultVar] заполнено значением 1, которое является ожидаемым значением здесь. enter image description here

Редактировать: чтобы добавить результаты про c в переменную типа объекта в SSIS, сначала нужно создать переменную типа объекта, а затем d установите для свойства ResultSet значение Full result set, а затем сопоставьте результаты с переменной.

enter image description here enter image description here

...