3

SQL クエリを実行し、データ フロー タスクを介して csv ファイルにエクスポートする SSIS パッケージがあります。csv が作成された後、SMTP サーバーに接続して csv ファイルを添付ファイルとして送信するように「スクリプト タスク」を設定しました。

私のローカル マシンではパッケージは正常に動作しますが、サーバー上の SQL Server Management Studio に読み込むと、期待どおりに動作しません。SQL Server MS は、パッケージが正常に実行され、csv ファイルが予期された場所に生成されたことを示しています。ただし、「スクリプト タスク」はまったく実行されていないようです。C# スクリプトには、デバッグ目的でファイルに書き込むステートメントをいくつか含めました。1 つは try/catch 例外ブロック用で、もう 1 つは通常の実行用です。

    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 を初めて使用し、この問題に何日も取り組んできました。

編集: SQL Server 2012 を実行しています

EDIT2:64ビットランタイムをfalseに設定してパッケージを保存し、SQL Serverエージェントを介して32ビットモードで実行しようとしたことにも言及する必要があります。

4

3 に答える 3

9

SSDT (Visual Studio インターフェイスである SQL Server Data Tools) ですべてが正常に機能し、パッケージが SSMS にデプロイされると、スクリプト タスクだけが失敗するという同様の状況に直面しました。

SSIS 2012 を使用して Excel シートを読み込んでから、スクリプト タスクで Excel マクロを呼び出して、シートの違いを並べ替えて強調表示しました。SSDT 環境ではすべて正常に動作していましたが、SSMS (スケジュールされたジョブ - 32 ビット モード) で実行すると、スクリプト タスクが実行されませんでした。ただし、違いを並べ替えたり強調表示したりせずに、生データが読み込まれた Excel シートを見ることができました。

SSMS パッケージ実行ログにエラーは記録されませんでした。コメント セクションで @Tab Alleman が強調しているように、一部のエラーはイベント ビューアーに記録されていました。私の場合、エラーはWindowsLogs > Systemの下に記録されました

ここに画像の説明を入力

Microsoft SQL Server Integration Services 11.0 へのアクセス中に、SQLSERVERAGENT のアクセス許可エラーが表示されました。

アプリケーション固有の権限設定では、CLSID {FDC3723D-1588-4BA3-92D4-42C430735D7D} および APPID {83B33982-693D-4824-B42E-7196AE61BB05} を持つ COM サーバー アプリケーションのローカル アクティベーション権限がユーザー NT SERVICE\SQLSERVERAGENT に付与されません。

そして、適切なアクセス権を付与した後 (アクセス権を付与する手順はこちらで説明されています)、アカウントが Excel にアクセスしようとしたときに、もう 1 つのアクセス許可エラーを受け取りました。

コンピューターの既定のアクセス許可設定では、CLSID {00024500-0000-0000-C000-000000000046} および APPID {00020812-0000-0000-C000-000000000046} を持つ COM サーバー アプリケーションのローカル アクティベーション アクセス許可がユーザー NT SERVICE\SQLSERVERAGENT に付与されません。

すべての権限エラーを解決した後でも、期待される出力が表示されませんでした。そこで、スクリプト タスクのカスタム ログ (手順についてはこちらを参照) を増やしました。その後、スクリプト タスクで発生した例外を確認できました。私の catch ブロックは次のようになります。

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

エラーを sysssislog テーブルに記録します (カスタム ログの構成時に構成する必要があります)。

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

カスタム ログを一覧表示する必要があります。

于 2015-08-27T03:00:04.423 に答える
3

私も同様の状況に直面しましたが、別の方法で解決しました。SSIS パッケージには 2 つの重要なタスクがありました。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. スクリプトを編集
  2. GUID のように見える c# プロジェクト名を右クリックし、プロパティを選択します。
  3. プロパティ ページの左側にある [ビルド] メニューを選択します。
  4. プラットフォーム ターゲット = x86 を設定します。

これで、スクリプト タスクが 32 ビット OLEDB Jet ドライバーと共に 32 ビット モードで実行されるようになります。

于 2016-09-16T22:55:50.123 に答える