从存储过程执行dtsx

时间:2014-06-11 08:27:37

标签: sql-server tsql ssis sql-agent-job

我从存储过程执行包时遇到问题。工作结束后,我收到错误:

  

Microsoft(R)SQL Server执行包实用程序版本11.0.2100.60   适用于64位版权所有(C)Microsoft Corporation。版权所有。   NULL开始:09:47:51错误:2014-06-11 09:47:51.34代码:   0xC0011007来源:{4B0EFACA-9BE8-4E0B-AEF7-A1453AF75271}
  描述:由于包的原因,无法将包加载为XML   没有有效的XML格式。将出现特定的XML解析器错误   发布。结束错误错误:2014-06-11 09:47:51.34代码:0xC0011002
  资料来源:{4B0EFACA-9BE8-4E0B-AEF7-A1453AF75271}描述:失败   打开包文件" \ server \ path \ Package.dtsx"由于错误   0x80070005"访问被拒绝。"。加载包时会发生这种情况   并且无法将文件正确打开或加载到XML中   文献。这可能是指定不正确的文件名的结果   调用LoadPackage或指定的XML文件时有错误   格式。结束错误无法加载包" \ server \ path \ Package.dtsx"   因为错误0xC0011002。说明:无法打开包文件   " \服务器\ Package.dtsx"由于错误0x80070005"访问被拒绝。"。   加载包时会发生这种情况,无法打开文件或   正确加载到XML文档中。这可能是结果   调用LoadPackage时指定不正确的文件名   指定的XML文件格式不正确。资源:   {4B0EFACA-9BE8-4E0B-AEF7-A1453AF75271}开始时间:09:47:51完成:   09:47:51 Elapsed:0.047秒NULL

步骤如下:

  1. 创建包含3个用户变量packageId[INT]connectionString[string]sourcePath[string]

    的包
    • packageId是一些专栏
    • connectionString用于查找,目标来源 - 在表达式中定义
    • sourcePathCSV档案
  2. 创建插入表变量并启动作业的程序
    示例执行:

    (1行受影响)
    Job' Package'开始成功了。

  3. 创建工作

  4. 我的查询:

    DECLARE @ConnectionString VARCHAR(1000)
    DECLARE @PackageId INT
    DECLARE @DataName NVARCHAR(2000)
    DECLARE @DtsxName NVARCHAR(200)
    DECLARE @PackagePath NVARCHAR(200)
    DECLARE @DataPath NVARCHAR(200)
    SELECT @DtsxName = 'TemporaryPackage'
    SELECT @PackagePath = '\\server\path\'
    SELECT @DataPath = '\\server\path\Data\'
    
    IF EXISTS (SELECT * FROM PackageImport p WHERE p.dtsxName = @DtsxName AND p.startImport IS NULL)
    BEGIN
    SELECT @ConnectionString = p.connectionString, @PackageId = p.packageId, @DataName = p.sourcePath
    FROM PackageImport p WHERE p.dtsxName = @DtsxName AND p.startImport IS NULL
    END
    
    DECLARE @SQLQuery AS VARCHAR(2000)
    SET @SQLQuery = 'DTExec.exe /FILE "\"' + @PackagePath + @DtsxName + '.dtsx\""'
     + ' /SET \Package.Variables[User::ConnectionString].Properties[Value];"\"'+ @ConnectionString + '\""'
     + ' /SET \Package.Variables[User::PackageId].Properties[Value];"\"'+ CAST(@PackageId as varchar(10)) + '\""'
     + ' /SET \Package.Variables[User::SourcePath].Properties[Value];"\"'+ @DataPath + @DataName + '\""'
    
    UPDATE dbo.PackageImport 
    SET [startImport]=GETDATE() 
    WHERE [packageId]=@PackageId AND [dtsxName] = @DtsxName AND [startImport] IS NULL
    
    -- import 
    DECLARE @result INT
    DECLARE @output TABLE( [ssisOutput] varchar(max) )
    INSERT INTO @output
    
    EXEC @result = master..xp_cmdshell @SQLQuery
    
    INSERT INTO PackageHistory(packageId, history)
    SELECT @PackageId, ssisOutput FROM @output o 
    UPDATE dbo.PackageImport 
    SET [stopImport]=GETDATE() 
    WHERE [packageId]=@PackageId AND [dtsxName] = @DtsxName AND [stopImport] IS NULL
    GO
    

    所有者作业是SQLSERVERAGENT,并且具有对\ server \ path

    的读/写权限

    有谁知道问题是什么,可以帮助我?

3 个答案:

答案 0 :(得分:0)

如果此程序包:\ server \ path \ Package.dtsx存储在与SQL Agent中执行的服务器不同的服务器上,则可能会出现双跃点问题。无论如何,尝试使用代理可能是值得的。 以下是一些信息:http://technet.microsoft.com/en-us/library/dd440761(v=sql.100).aspx

答案 1 :(得分:0)

我找到了简单的解决方案。我改变了变量 SELECT @PackagePath ='\ server \ path \' SELECT @DataPath ='\ server \ path \ Data \'

SELECT @PackagePath ='C:\' SELECT @DataPath ='C:\'

我知道这不是最好的解决方案,但我尝试更改sql_serveragent的权限,但问题仍然存在。

答案 2 :(得分:0)

我找到了另一种解决方案,对我来说最合适。 在文件夹C:\ Program Files \ Microsoft SQL Server \ 110 \ DTS \ Packages中 为我的指定包和数据文件创建文件夹,并在READ上更改组用户的权限并且正常工作。