SSIS 执行成功,但它似乎不是 运行 脚本任务部分

SSIS is executing successfully, but it doesn't seem to be running the script task portion

我有一个运行 SQL 查询并通过数据流任务将其导出到 csv 文件的 SSIS 包。创建 csv 文件后,我将 "Script Task" 设置为连接到 SMTP 服务器并将 csv 文件作为附件发送。

在我的本地机器上,程序包运行良好,但是当我将它加载到服务器上的 SQL Server Management Studio 时,它无法按预期工作。 SQL 服务器 MS 表示包执行成功,并且在预期位置生成了 csv 文件。但是,"Script Task" 似乎根本没有执行。我在 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;

        }
    }

没有发送电子邮件 - 没有写入文件。就好像任务根本不是 运行 尽管 "Successful Execution".

我确实注意到 SQL Server Integration Services 11.0 服务在我的本地机器上 运行 而不是在服务器上。但是,如果我在本地计算机上禁用此服务,任务仍会执行。

我还漏掉了什么吗?我是 SQL 服务器的新手,几天来我一直在研究这个问题。

编辑:我是 运行 SQL Server 2012

EDIT2:我还应该提到,我已经尝试通过 SQL 服务器代理将 64 位运行时设置为 false 和 运行 以 32 位模式保存包。

我之前遇到过类似的情况,在 SSDT(SQL Server Data Tools - 这是 Visual studio 接口)中一切正常,当我的包部署在 SSMS 中时,只有脚本任务失败了。

使用 SSIS 2012,我加载了一个 excel sheet,然后在脚本任务中,我调用了一个 Excel 宏来排序并突出显示 sheet。在 SSDT 环境中一切正常,但当我在 SSMS 中 运行(作为计划作业 - 32 位模式)时,脚本任务未执行。但是,我可以看到 Excel sheet 加载了原始数据 - 没有排序和突出差异。

SSMS 包执行日志中未捕获到任何错误。正如@Tab Alleman 在评论部分强调的那样,一些错误记录在事件查看器中。就我而言,错误记录在 WindowsLogs > System

在访问 Microsoft SQL Server Integration Services 11.0 时显示 SQLSERVERAGENT 的权限错误。

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

然后在 g运行 进行适当的访问后(描述了 g运行t 访问的步骤 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 块看起来像下面的那个:

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

它将在 sysssislog table 中记录错误(您必须在配置自定义日志记录时配置)

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

应该列出您的自定义日志。

我也遇到过类似的情况,但是解决方法不同。我的 SSIS 包中有两个关键任务。脚本任务 运行ning 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 只是忽略它,就好像它被禁用了一样。我确实在我的事件查看器中发现了一些审计失败。

我的脚本任务不是 运行ning 的根本原因是因为它是为 x64(默认设置)编译的。以下是我用来解决此问题的步骤:

  1. 编辑脚本
  2. 右键单击看起来像 GUID 的 c# 项目名称并选择属性
  3. Select属性页左侧的构建菜单
  4. 设置平台目标 = x86

现在您的脚本任务将 运行 与您的 32 位 OLEDB Jet 驱动程序一起处于 32 位模式。

检查项目的构建版本。 当您的构建版本大于目录使用的目标服务器版本时,就会发生这种情况。 IE。将 visual studio 中的 2017 版本构建到 2016 sql 服务器。 更改项目的构建版本,然后重新编译所有脚本任务。 使用 ispac 文件重新部署您的项目。 脚本任务将按预期执行。