SSIS正在成功执行,但它似乎没有运行脚本任务部分

auf*_*fty 3 c# sql-server csv ssis script-task

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

在我的本地计算机上,程序包运行正常,但是当我将其加载到服务器上的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;

        }
    }
Run Code Online (Sandbox Code Playgroud)

没有发送电子邮件 - 没有写入文件.尽管"成功执行",但好像任务根本没有运行.

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

我错过了别的什么吗?我是SQL Server的新手,几天来我一直在研究这个问题.

编辑:我正在运行SQL Server 2012

编辑2:我还应该提一下,我已经尝试将64位运行时设置为false并通过SQL Server代理以32位模式运行它.

Kar*_*hik 6

我之前遇到过类似情况,SSDT(SQL Server数据工具 - Visual Studio界面)的一切正常,当我的软件包部署在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时收到了一个权限错误

机器默认权限设置不会将具有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);
            }
Run Code Online (Sandbox Code Playgroud)

这将记录sysssislog表中的错误(您必须在配置自定义日志记录时配置该错误)

select * from [*YourDatabaseName*].[dbo].[sysssislog]
Run Code Online (Sandbox Code Playgroud)

应列出您的自定义日志.