2015-07-08 3 views
1

У меня есть пакет SSIS, который выполняет SQL-запрос и экспортирует его в файл csv с помощью задачи потока данных. После создания csv у меня есть «Задача скрипта», установленная для подключения к SMTP-серверу и отправки файла csv в качестве вложения.SSIS успешно выполняется, но, похоже, не работает часть сценария сценария

На моей локальной машине пакет работает нормально, но когда я загружаю его в SQL Server Management Studio на сервер, он не работает должным образом. SQL Server MS говорит, что пакет успешно выполнен, и файл csv создается в ожидаемом месте. Тем не менее, «Задача скрипта», похоже, вообще не выполняется. Я включил некоторые инструкции в сценарии C# для записи в файл для целей отладки - один для блока исключения try/catch и несколько других для нормального выполнения.

public void Main() 
    { 
     string sSubject = "Weekly PAX Test"; 
     string sBody = "Test Message"; 
     int iPriority = 2; 

     if (SendMail(sSubject, sBody, iPriority)) 
     { 
      Dts.TaskResult = (int)ScriptResults.Success; 
     } 
     else 
     { 
      //Fails the Task 
      Dts.TaskResult = (int)ScriptResults.Failure; 
     } 
    } 

    public bool SendMail(string sSubject, string sMessage, int iPriority) 
    { 
     try 
     { 
      string sEmailServer = Dts.Variables["User::sEmailServer"].Value.ToString(); 
      string sEmailPort = Dts.Variables["User::sEmailPort"].Value.ToString(); 
      string sEmailUser = Dts.Variables["User::sEmailUser"].Value.ToString(); 
      string sEmailPassword = Dts.Variables["User::sEmailPassword"].Value.ToString(); 
      string sEmailSendTo = Dts.Variables["User::sEmailSendTo"].Value.ToString(); 
      string sEmailSendFrom = Dts.Variables["User::sEmailSendFrom"].Value.ToString(); 
      string sEmailSendFromName = Dts.Variables["User::sEmailSendFromName"].Value.ToString(); 
      string sAttachmentPath = Dts.Variables["User::sAttachmentPath"].Value.ToString(); 

      SmtpClient smtpClient = new SmtpClient(); 
      MailMessage message = new MailMessage(); 

      MailAddress fromAddress = new MailAddress(sEmailSendFrom, sEmailSendFromName); 

      //You can have multiple emails separated by ; 
      string[] sEmailTo = Regex.Split(sEmailSendTo, ";"); 
      int sEmailServerSMTP = int.Parse(sEmailPort); 

      smtpClient.Host = sEmailServer; 
      smtpClient.Port = sEmailServerSMTP; 

      System.Net.NetworkCredential myCredentials = 
       new System.Net.NetworkCredential(sEmailUser, sEmailPassword); 
      smtpClient.Credentials = myCredentials; 

      message.From = fromAddress; 

      if (sEmailTo != null) 
      { 
       for (int i = 0; i < sEmailTo.Length; ++i) 
       { 
        if (sEmailTo[i] != null && sEmailTo[i] != "") 
        { 
         message.To.Add(sEmailTo[i]); 
        } 
       } 
      } 

      switch (iPriority) 
      { 
       case 1: 
        message.Priority = MailPriority.High; 
        break; 
       case 3: 
        message.Priority = MailPriority.Low; 
        break; 
       default: 
        message.Priority = MailPriority.Normal; 
        break; 
      } 

      //You can enable this for Attachments. 
      //sAttachmentPath is a string variable for the file path. 

      Attachment myAttachment = new Attachment(sAttachmentPath); 
      message.Attachments.Add(myAttachment); 


      message.Subject = sSubject; 
      message.IsBodyHtml = true; 
      message.Body = sMessage; 

      smtpClient.Send(message); 
      System.IO.File.WriteAllText("C:\\Users\\SQLCLservice\\SQLServerAgent\\file.txt", "Test"); 
      return true; 
     } 
     catch (Exception ex) 
     { 
      System.IO.File.WriteAllText("C:\\Users\\SQLCLservice\\SQLServerAgent\\ex.txt", ex.ToString()); 
      return false; 

     } 
    } 

Не отправлено ни одного электронного письма - файлы не записываются. Это как если бы задача не выполнялась вообще, несмотря на «Успешное выполнение».

Я заметил, что служба SQL Server Integration Services 11.0 работает на моем локальном компьютере, но не на сервере. Однако, если я отключу эту службу на своем локальном компьютере, задача все еще выполняется.

Я пропустил что-то еще? Я довольно новичок в SQL Server, и я работаю над этой проблемой в течение нескольких дней.

EDIT: Я бегу SQL Server 2012

edit2: Я должен также упомянуть, что я пытался как сохранить пакет с 64-разрядной среды выполнения, установленным в ложь и запустить его в 32-битном режиме через Агент SQL Server.

+0

Вы проверили журналы ошибок сервера? –

+0

Журналы для пакета показывают успешное выполнение. Я не уверен, какие другие журналы я должен проверить. – aufty

+1

Вы можете проверить журналы событий Windows на сервере. Также см. Здесь: https://msdn.microsoft.com/en-us/library/ms140246(v=sql.110).aspx –

ответ

3

Раньше я столкнулся с аналогичной ситуацией, где все хорошо работает в SSDT (SQL Server Data Tools - интерфейс Visual Studio), и когда мой пакет развернут в SSMS, просто проблема сценария не срабатывала.

Используя SSIS 2012, я загружал лист excel, а затем в задачу скрипта, я вызывал макрос Excel для сортировки и выделения различий в листе. Все работало нормально в среде SSDT, но когда я запускался в SSMS (в качестве запланированного задания - 32-разрядный режим), задача сценария не выполнялась. Однако я мог видеть, что лист Excel загружен с необработанными данными - без сортировки и выделения различий.

Ошибок не было зафиксировано в журналах выполнения SSMS-пакетов. Как подчеркнуто @Tab Alleman в разделе комментариев, некоторые из ошибок были зарегистрированы в средстве просмотра событий. В моем случае ошибка была зарегистрирована под WindowsLogs> Система

enter image description here

Что показали ошибки разрешения для SQLSERVERAgent при доступе к Microsoft SQL Server Службы Integration 11.0.

The application-specific permission settings do not grant Local Activation permission for the COM Server application with CLSID {FDC3723D-1588-4BA3-92D4-42C430735D7D} and APPID {83B33982-693D-4824-B42E-7196AE61BB05} to the user NT SERVICE\SQLSERVERAGENT

И затем после предоставления соответствующего доступа (шаги по обеспечению доступа описывается here), я получил еще одну ошибку разрешения, а учетная запись пытался получить доступ к Excel

The machine-default permission settings do not grant Local Activation permission for the COM Server application with CLSID {00024500-0000-0000-C000-000000000046} and APPID {00020812-0000-0000-C000-000000000046} to the user NT SERVICE\SQLSERVERAGENT

Даже после устранения всех ошибок разрешения , Я все еще не мог видеть ожидаемый результат. Поэтому я увеличил пользовательскую регистрацию (см. here для шагов) для задачи сценария. Тогда я смог увидеть исключения, поднятые в задаче скрипта. Мой улов блок выглядит как на картинке ниже:

catch (Exception ex) 
      { 
       Dts.Log(ex.ToString(), 0, emptyBytes); 
      } 

Что будет регистрировать ошибки в sysssislog таблицы (которые необходимо настроить при настройке пользовательских протоколирование)

select * from [*YourDatabaseName*].[dbo].[sysssislog] 

Если список вниз вашу таможню журналы.

0

Я тоже столкнулся с подобной ситуацией, но решил ее по-другому. У меня было две ключевые задачи в моем пакете SSIS. Задача скрипта, запускающая C# и задачу потока данных, читающую файл Excel. Я впервые получил эту ошибку:

OLE DB provider Microsoft.Jet.OLEDB.4.0 is not registered. If the 64-bit drive is not installed, run the package in 32-bit mode. 

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

Основная причина моей задачи «Сценарий» не выполнялась, потому что она компилировалась для x64 (настройка по умолчанию). Вот мои шаги, которые я использовал, чтобы исправить это:

  1. Edit Script
  2. Щелкните правой кнопкой мыши на C# имя проекта, который выглядит как GUID и выберите свойства
  3. Выберите меню сборки на левой стороне свойств страница
  4. Установите цель платформы = x86

Теперь ваша задача сценария теперь будет работать в 32-битном режиме вместе с 32 разрядным драйвером OLEDB Jet.

Смежные вопросы