【问题标题】:Why does SQL job running SSIS fails to move Excel file to SharePoint folder?为什么运行 SSIS 的 SQL 作业无法将 Excel 文件移动到 SharePoint 文件夹?
【发布时间】:2013-01-13 15:15:10
【问题描述】:

我在 SQL Server 2008 R2 中创建了一个多步骤 SSIS 包,该包在集成服务中的 DTS 包下启动时运行良好,但在涉及复制到 SharePoint 文件夹的步骤中的 SQL Server 代理作业中调用时失败在服务器上创建的 Excel 文件。在包中,Run64bitRuntime 设置为 False,当在作业的一个步骤中调用包时,在执行选项下选中“使用 32 位运行时”。这适用于从位于其他 SharePoint 文件夹中的 Excel 文件中读取信息的其他 SSIS 包。这里的独特之处在于我现在正尝试将在服务器上创建的 Excel 文件复制到 SharePoint 文件夹。如果不是因为 Excel 文件的格式和内容不统一,我会改用 SSRS。

这是我选择 SQL Server 代理作业的“查看历史记录”时返回的错误消息。

日期 2013 年 1 月 29 日下午 3:13:47 记录作业历史记录(数据拉取)

步骤 ID 1 服务器 xxxx-xxx-xx 作业名称数据拉取步骤名称运行 xxxx_Extractxxx 持续时间 00:16:13 Sql Severity 0 Sql 消息 ID 0 操作员通过电子邮件发送操作员网络发送操作员分页重试 已尝试 0

留言

以用户身份执行:CABLE!svcnvdeautomation。微软 (R) SQL Server 为 32 位执行包实用程序版本 10.50.1600.1 版权所有 (C) Microsoft Corporation 2010。保留所有权利。
开始时间:下午 3:13:47 错误:2013-01-29 15:30:00.01 代码: 0x00000001 来源:创建 Excel 文件说明: System.Reflection.TargetInvocationException:已引发异常 通过调用的目标。 ---> System.Runtime.InteropServices.COMException (0x800A03EC):异常 从 HRESULT:0x800A03EC 在 Microsoft.Office.Interop.Excel.WorkbookClass.SaveAs(对象文件名, 对象 FileFormat、对象密码、对象 WriteResPassword、对象 ReadOnlyRecommended、对象 CreateBackup、XlSaveAsAccessMode AccessMode, 对象 ConflictResolution, 对象 AddToMru, 对象 TextCodepage,对象 TextVisualLayout,对象本地)在 ST_87e8d62a054b4e16b60297154afc19d8.csproj.ScriptMain.Main() --- 内部异常堆栈跟踪结束 --- 在 System.RuntimeMethodHandle._InvokeMethodFast(对象目标,对象 [] 参数,SignatureStruct& sig,MethodAttributes 方法属性, RuntimeTypeHandle typeOwner) 在 System.RuntimeMethodHandle.InvokeMethodFast(对象目标,对象 [] 参数,签名 sig,MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 在 System.Reflection.RuntimeMethodInfo.Invoke(对象 obj,BindingFlags invokeAttr、Binder binder、Object[] 参数、CultureInfo 文化、 Boolean skipVisibilityChecks)在 System.Reflection.RuntimeMethodInfo.Invoke(对象 obj,BindingFlags invokeAttr、Binder binder、Object[] 参数、CultureInfo 文化)
在 System.RuntimeType.InvokeMember(字符串名称,BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] 修饰符、CultureInfo 文化、String[] 命名参数)在 System.Type.InvokeMember(字符串名称,BindingFlags invokeAttr、Binder binder、Object 目标、Object[] args、CultureInfo 文化)在 Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript() 结束错误 DTExec:包执行返回 DTSER_FAILURE (1)。 开始时间:下午 3:13:47 结束时间:下午 3:30:00 经过时间:972.573 秒。 包执行失败。步骤失败。

如果有帮助,下面列出的是用于复制 Excel 文件的代码。

public void Main()
{

    SharePointListsService.Lists listService = new SharePointListsService.Lists();
    listService.Credentials = System.Net.CredentialCache.DefaultCredentials;

    // Create variable with format of "2012-11-28"
    string DateTimeNow = DateTime.Now.ToString("yyyy") + "-" + DateTime.Now.ToString("MM") + "-" + DateTime.Now.ToString("dd");

    // Check out the file as defined in SharePoint.
    string fileCheckout = "http://xx.yy.com/Shared%20Documents/Task%20Compliance%20Report.xls";
    bool myResults = listService.CheckOutFile(fileCheckout, "true", DateTime.Now.ToString("f"));


    // Full file name including path and extension
    // "D:\Work area\Reports\Project.xls"
    string FullFileName = Dts.Variables["User::ReportsExcelFileName"].Value.ToString();

    // File Name without path and extension
    // "Project"
    string FileName = GetFileNameWithoutExtFromPath(FullFileName);

    // Path only
    // "D:\Work area\Reports\"
    string Path = GetDirFromPath(FullFileName);

    // From the source file (FullFileName) assemble the [Path] and [Filename] of new file copy that includes a specific date format attached to new file name.
    // "D:\Work area\Reports\Project 2012-11-28.xls"
    File.Copy(FullFileName, (Path + "\\" + FileName + " " + DateTimeNow + ".xls"), true);

    // Get UNC Folder path
    // "\\xx.yy.com\Shared Documents\Data Pulls"        string UNCFolder = Dts.Variables["UNCFolder"].Value.ToString();

    // Get File name as it appears in the Reports folder
    string ReportsExcelFile = FullFileName;

    // Copy the Excel file from the Reports directory to the SharePoint UNC folder location
    File.Copy(ReportsExcelFile, (UNCFolder + "\\" + FileName + ".xls"), true);



    //Check in
    //string fileCheckin = Dts.Variables["User::URLFolder"].Value.ToString();
    string fileCheckin = "http://xx.yy.com/Shared%20Documents/Task%20Compliance%20Report.xls";
    myResults = listService.CheckInFile(fileCheckin, "Completed revision.", "0");

    Dts.TaskResult = (int)ScriptResults.Success;
}

       public String GetFileNameWithoutExtFromPath(String path)
        {
            try
            {
                String filename = path.Substring(path.LastIndexOf("\\") + 1);
                int pos = filename.LastIndexOf(".");

                if (pos != -1)
                    return filename.Substring(0, pos);
                else
                    return filename;
            }

            catch (Exception)
            {
                // error  
                return "";
            }
        }


        public String GetDirFromPath(String path)
        {
            try
            {
                return path.Substring(0, path.LastIndexOf("\\") + 1);
            }
            catch (Exception)
            {
                // error
                return "";
            }
        }

在 SQL Server 配置管理器下,我已将 SQL Server 代理设置为应用具有网络访问权限的登录,其他作业正在调用其他 SSIS 包成功应用该登录。此外,在服务器上的 Componet 服务下,我转到了我的电脑,右键单击并选择属性,这会打开带有六个选项卡的我的电脑属性框。我选择了 COM 安全选项卡并编辑了访问权限以及启动和激活权限的编辑限制。在每个我添加了网络服务。对于访问权限,我检查了允许本地访问,对于启动和激活权限,我选择了本地启动和本地激活。

鉴于上述详细信息,有人可以帮我确定为什么 SSIS 包在 SQL Server 代理下运行时复制 Excel 文件的步骤继续失败?

【问题讨论】:

    标签: excel ssis jobs


    【解决方案1】:

    添加 C:\Windows\SysWOW64\config\systemprofile\Desktop 文件夹对我有用。

    【讨论】:

      【解决方案2】:

      我假设 SQL 作业正在运行 SQL Server Agent Service Account 下的 SSIS 包,它可能没有正确的权限将文件从一个文件夹位置复制/移动到另一个位置。您需要设置一个使用域帐户(最好)凭据的代理帐户。域帐户应具有在文件夹之间复制/移动文件的正确权限级别。

      在以下 SO 问题中的答案将逐步了解如何配置代理帐户。它还解释了如何使用代理帐户在 SQL 作业中执行 SSIS 包。

      How do I create a step in my SQL Server Agent Job which will run my SSIS package?

      至少,当我在文件夹之间移动文件时遇到类似问题时,我就是这样做的。

      希望能指导您找到问题的解决方案。

      【讨论】:

      • 我创建了使用 SSIS 的代理,但忘记在运行包的作业步骤中应用它。像往常一样,我四处寻找,除了眼前的东西。 :) 你的建议解决了这个问题。 Siva,感谢您的帮助和快速响应。
      • 除了代理之外,还需要进行一项更改。由于我使用的是 64X,因此我必须添加一个“桌面”文件夹,如下所示:“C:\Windows\SysWOW64\config\systemprofile\Desktop”。 Excel 在 SQL Server 代理下运行时似乎需要这个。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-12
      • 1970-01-01
      • 2014-03-02
      • 2017-09-29
      相关资源
      最近更新 更多