Как регистрировать выходные данные SSIS Execute SQL Task

Я новичок в SSIS.

Я создал пакет SSIS с помощью «Выполнить задачу SQL». Я вызвал хранимую процедуру. Моя хранимая процедура печатает несколько сообщений, таких как «Вставить начато» «Обновление начато» «Обновление завершено», но не возвращает никакого набора результатов.

Как записать вывод хранимой процедуры в файл журнала в SSIS.

Пожалуйста, помогите мне, я борюсь последние два дня.

Я пробовал использовать DTExec вот так

DTExec / f "C: \ Users \ Karthick \ Desktop \ SSIS \ Package.dtsx"> MyOutput.txt

Но он печатает только значения Execute SQL Task, а не операторы печати хранимой процедуры.


person StackUser    schedule 16.11.2015    source источник
comment
Скажите, пожалуйста, как мне записать вывод хранимой процедуры в файл журнала в SSIS   -  person StackUser    schedule 16.11.2015


Ответы (3)


SSIS - это продукт, который, если щелкнуть его правой кнопкой мыши, в конечном итоге что-то сделает. А если серьезно, ребята, это напоминает мне плохой день у VB6 ...

Это звучит как простая вещь, но для этого нужно много щелкать правой кнопкой мыши и отбирать небольшие фрагменты кода здесь и там. Вот шаги:

  1. Объявите один или несколько выходные параметры в вашей хранимой процедуре (SPROC), чтобы содержать сообщения о состоянии
  2. В SSIS измените свой вызов в SPROC, чтобы он содержал вопросительный знак SSIS "подстановочные знаки" (или как они их называют)
  3. Добавьте переменную в SSIS.
  4. Отображение выходных параметров SPROC в переменную SSIS
  5. Настройте поставщика журналов в SSIS
  6. Включите событие , чтобы запускать запись ваших статусных сообщений в журнал
  7. Создайте еще одну задачу - SSIS для фактической записи данных в журнал. Я рекомендую использовать SQL, но решать вам

Если вы прочтете ссылки выше, вы поймете идею. Читайте подробности и комментарии редакторов.

Лучше всего начать с вашего SPROC, объявив один или несколько выходных параметров и установив их с вашими сообщениями о состоянии.

SET @my_status = 'Insert Started'

Возможно, вы хотите объединить все свои сообщения в один выходной параметр или иметь несколько. Вам решать.

Теперь щелкните правой кнопкой мыши холст потока управления SSIS и добавьте переменную. Промойте и повторите, если у вас больше выходных параметров SPROC.

Щелкните правой кнопкой мыши свою задачу SQL и отредактируйте свой вызов SQL, чтобы он выглядел примерно так:

EXEC myStoredProcedure ? OUTPUT

Если у вас есть входные параметры, их необходимо здесь учесть. ? Это важно, поскольку он представляет собой нумерованный параметр, начинающийся с нуля, который необходимо сопоставить, чтобы службы SSIS действительно что-либо делали с вашим сообщением о состоянии. Дизайн напоминает почтовые слияния Wordstar из каменного века персональных компьютеров.

Перейти к сопоставлению параметров. Щелкните Добавить и найдите свою переменную. Это будет что-то уродливое

User::my_status

Если бы мы все думали, что имя параметра - это имя параметра, мы все ошибались бы. В этом примере вы должны указать здесь 0 (ноль), поскольку это, очевидно, параметр нулевого eth в вашем SPROC.

Хорошо, теперь вы настроили переменную, которую вы можете регистрировать. Но ты еще не закончил. Вы должны настроить другую задачу «Выполнение SQL», чтобы это регистрировать. Я не собираюсь рассказывать вам об этом дорогом читателе, но, надеюсь, Отличная статья Аалама Ранги все еще существует, чтобы дать вам все необходимое для этого. Вкратце, вы должны: а) настроить провайдер ведения журнала SSIS, б) включить событие, которое будет запускать запись ваших данных в журнал, в) написать оператор вставки SQL с кучей дополнительных вопросительных знаков в нем, которые фактически будут записывать ваши данные. в стандартную таблицу SQL, в которую вы хотите войти. Если вы хотите войти в файл, эта статья все равно будет вам полезна. Вот код вставки, который отлично работает для SSIS и Visual Studio 2015. Спасибо, Аалам!

INSERT INTO [dbo].[sysssislog]
([event]
,[computer]
,[operator]
,[ source]
,[sourceid]
,[executionid]
,[starttime]
,[endtime]
,[datacode]
,[databytes]
,[message])
VALUES
('*SSIS-OnVariableValueChanged' -- Custom event name
,? -- param 0
,? -- param 1
,? -- param 2
,? -- param 3
,? -- param 4
,? -- param 5
,? -- param 6
,0 -- Zero
,'' -- Blank string
,?) -- param 7

Удачного щелчка правой кнопкой мыши!

person Andrew Cowenhoven    schedule 01.03.2018

Так можно подойти,

  • Записывать SSIS в таблицу SQL
  • Зарегистрируйте вашу хранимую процедуру в таблице
  • Создайте представление, например, чтобы вместе увидеть журнал
  • и распечатать это представление с SSIS в файле
person Mattia Caputo    schedule 16.11.2015
comment
Есть ли самый простой способ добиться этого? - person StackUser; 16.11.2015
comment
Мой вопрос в том, как записать операторы печати хранимой процедуры в файл журнала. - person StackUser; 16.11.2015
comment
я понимаю ваш вопрос, но нет возможности сделать это напрямую. ты должен сделать такой трюк - person Mattia Caputo; 16.11.2015

Думаю, вы не можете поймать хранимую процедуру печати сообщений через Execute SQL Task. Для этого вам нужно использовать Script Task или Script Component. Внутри сценария вы можете вызвать свою хранимую процедуру и использовать обработчик событий InfoMessage для перехвата сообщений из хранимой процедуры.

Пример кода ниже -

        public event SqlInfoMessageEventHandler InfoMessage;
        void myConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
        {
            using (StreamWriter writer = new StreamWriter(<your log file path>))
                 {
                  writer.Write(e.Message);
                 }
        }

        public void Main()
        {
         using (var conn = new SqlConnection(<your connection manager>))
         using (var command = new SqlCommand(<your sp name>, conn)
             {
             CommandType = CommandType.StoredProcedure
             })
         try
            {
             {
              ((SqlConnection)conn).InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);
                conn.Open();
                command.ExecuteNonQuery();
             }
            }
         catch
            {
              throw;
            }
         finally
            {
              command.Dispose();
            }

         Dts.TaskResult = (int)ScriptResults.Success;
         }
person Abhishek    schedule 16.11.2015