【问题标题】:Powershell error setting Environment variable for an SSIS package executionPowershell 错误设置 SSIS 包执行的环境变量
【发布时间】:2018-04-15 13:34:04
【问题描述】:

我的 Powershell 脚本执行 SSIS 包,但首先覆盖环境变量。 EnvironmentInfo 对象上的 Alter 方法失败并显示一般错误消息:“对象 [EnvironmentInfo[@Name='MyVariable']' 上的操作 'Alter' 在执行期间失败。”

我也尝试删除环境变量并更改 Project 参数,但在 Project 对象的 Alter 方法上收到相同的错误。

我怀疑这要么是 1) 使用 32 位版本的 SQL Server 2012 的缺点,要么是 2) 权限问题。

我已确保执行 Windows 帐户对 SSISDB 数据库和 SSIS 目录项目以及子文件夹、环境等具有完全权限。

关于错误的任何想法或如何获取更多详细信息?我在 Windows 事件日志中看不到任何内容。

这是我的代码:

# Variables
$ServerInstance = "MyServer"
$32bitSQLServer = "false" #use #null for 32-bit
$SSISNamespace = "Microsoft.SqlServer.Management.IntegrationServices"
$FolderName = "MyFolder"
$ProjectName = "MyProject"
$PackageName = "MyPackage.dtsx"
$EnvironmentName = "MyEnvironment"
$VariableName = "MyVariable"
$VariableValue = Read-Host "What is the new environment variable value? "

# Create a connection to the server - Have to use Windows Authentication in order to Execute the Package
$sqlConnectionString = `
    "Data Source=" + $ServerInstance + ";Initial Catalog=master;Integrated Security=SSPI;"
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection $sqlConnectionString

# Create the Integration Services object
[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Management.IntegrationServices")  
$integrationServices = New-Object $SSISNamespace".IntegrationServices" $sqlConnection

# Get the Integration Services catalog
$catalog = $integrationServices.Catalogs["SSISDB"]

# Get the folder
$folder = $catalog.Folders[$FolderName]

# Get the project
$project = $folder.Projects[$ProjectName]

# Get the environment
$environment = $folder.Environments[$EnvironmentName]

# Get the environment reference
$environmentReference = $project.References.Item($EnvironmentName, $FolderName)            
$environmentReference.Refresh() 

# Get the package
$package = $project.Packages[$PackageName]

# Set the Environment Variable
$environment.Variables[$VariableName].Value = $VariableValue
$environment.Alter()

# Execute the package
Write-Host "Running Package " $PackageName "..."
$result = $package.Execute($32bitSQLServer, $environmentReference)

# Alternate approach, also not working
# $project.Parameters[$VariableName].Set([Microsoft.SqlServer.Management.IntegrationServices.ParameterInfo+ParameterValueType]::Literal,$VariableValue)
# $project.Alter()
# $result = $package.Execute($32bitSQLServer, $environmentReference)

Write-Host "Done."

【问题讨论】:

    标签: sql-server powershell ssis sql-server-2012


    【解决方案1】:

    只需修改包上的参数,不用担心环境变量。我确信它不会改变存储在服务器包中的值,只是你的$package 变量中保存的对象。像这样的:

    $package.Parameters[$VariableName].Set([Microsoft.SqlServer.Management.IntegrationServices.ParameterInfo+ParameterValueType]::Literal, $VariableValue)
    $package.Alter()
    
    $execution = $integrationServices.Catalogs['SSISDB'].Executions[$package.Execute($false, ($package.Parent.References[$package_name, $folder_Name]))]
    
    do {
        $execution.Refresh()
    } until ($execution.Completed)
    

    【讨论】:

    • 谢谢,戴夫,但我已经尝试过了(参见帖子和代码)。该参数在项目而不是包上,所以我在项目上设置了值并调用了 Alter() 但得到了与在环境上调用 Alter() 相同的错误。这似乎与环境有关,例如访问权限或我使用的是 32 位 SQL Server。
    【解决方案2】:

    因此,通过一些挖掘,我找到了错误的答案。结果我的 GAC(Windows\assembly)中有 Microsoft.SqlServer.Management.IntegrationServices 程序集的多个版本(11.0.0.0、12.0.0.0、13.0.0.0)。检查 SSISDB 目录的架构,它是版本 12.0.5000.0,这意味着我需要 12.0.0.0 版本的程序集。我使用的代码:

    [Reflection.Assembly]::LoadWithPartialName( "Microsoft.SqlServer.Management.IntegrationServices")
    

    加载了错误的版本(可能是 13.0.0.0),因此我需要显式加载与此 SSIS 安装匹配的程序集版本,即 12.0.0.0:

    [System.Reflection.Assembly]::Load("Microsoft.SqlServer.Management.IntegrationServices, Version=12.0.0.0, Culture=neutral, processorArchitecture=MSIL, PublicKeyToken=89845dcd8080cc91")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-03
      • 2020-02-06
      • 2020-11-18
      • 2020-09-29
      • 1970-01-01
      • 2016-01-11
      • 2018-06-18
      • 2015-11-23
      相关资源
      最近更新 更多