【问题标题】:Set an SSIS package Package Parameter and execute it using the new Param value设置一个 SSIS 包包参数并使用新的 Param 值执行它
【发布时间】:2021-05-02 22:50:42
【问题描述】:

我一直在尝试寻找设置在 SSIS 包内配置的连接字符串属性的最佳方法。我读到一些系统配置参数被暴露。下面的代码正确设置了参数,但是,当我查询执行表时,包永远不会使用更改的参数或连接字符串运行。 (也许有人可以提供解决方案或者更好的方法来在powershell中的execute()之前动态设置包中的连接字符串)

[System.Reflection.Assembly]::Load("Microsoft.SQLServer.Management.IntegrationServices, "+
"Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL") | Out-Null
$sqlConnectionString = `
"Data Source=xxx;Initial Catalog=master;Integrated Security=SSPI;"
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection $sqlConnectionString
$SSISNamespace = "Microsoft.SqlServer.Management.IntegrationServices"
$SSIS = New-Object $SSISNamespace".IntegrationServices" $sqlConnection
$catalog = $SSIS.Catalogs["SSISDB"]

$parameterName ="CM.ClientDB.InitialCatalog"

$paramValue ="[SomeDatabase0001]" # I have tried it with and without brackets []

$ssisPackage = $catalog.Folders["ProjectFolder"].Projects["Project"].Packages["Package.dtsx"]

Write-Output $ssisPackage.Parameters[$parameterName]

$ssisPackage.Parameters[$parameterName].Set([Microsoft.SqlServer.Management.IntegrationServices.ParameterInfo+ParameterValueType]::Literal,$paramValue)
$ssisProject.Alter()

Write-Output $ssisPackage.Parameters[$parameterName]

try {
    $ssisPackage.Execute("false", $null)    
}
catch {
    Write-Output "Fail"
}
Write-Output "Done" 

输出似乎表明该值设置正确。

Name                   : CM.ClientDB.InitialCatalog
...
DesignDefaultValue     : [SomeDatabase]
DefaultValue           :

Name                   : CM.ClientDB.InitialCatalog
DesignDefaultValue     : [SomeDatabase]
DefaultValue           : SomeDatabase0001

...
32
Done

根据我在 ssisdb 中可以找到的内容:

SELECT * from internal.execution_parameter_values where parameter_name='CM.ClientDB.InitialCatalog'

...(never changes)
paramater_name              paramater_value  
---------------             --------------
CM.ClientDB.InitialCatalog  [SomeDatabase]
CM.ClientDB.InitialCatalog  [SomeDatabase]
CM.ClientDB.InitialCatalog  [SomeDatabase]
CM.ClientDB.InitialCatalog  [SomeDatabase]
CM.ClientDB.InitialCatalog  [SomeDatabase]
...

【问题讨论】:

  • 看PS,看不懂$ssisProject是从哪里来的
  • @billinkc - 哇!这就是问题所在。调用 $ssisPackage.Alter() 时看起来更好。

标签: powershell ssis azure-powershell


【解决方案1】:

在上述评论的帮助和一些认真的搜索之后,我拼凑了一个解决方案。自然,构建服务器没有安装 SSIS 数据工具包,因此在 azure dev-ops 中运行构建管道时,一些在我的机器上工作的管理部分失败了。我发现我可以在根目录中提供所需的程序集并从那里加载它们。不是理想的解决方案。由于另一个构建任务等待其输出,我需要该包同步运行。我发现有一些重载需要执行,其中一个允许您覆盖运行时参数,包括 SYNCHRONIZED。

$newdbname = $env:NewDatabaseName

####################
$bytes = [System.IO.File]::ReadAllBytes($PSScriptRoot+"\Microsoft.SqlServer.Management.IntegrationServices.dll")
[System.Reflection.Assembly]::Load($bytes)

$bytes = [System.IO.File]::ReadAllBytes($PSScriptRoot+"\Microsoft.SqlServer.Management.IntegrationServicesEnum.dll")
[System.Reflection.Assembly]::Load($bytes)

$bytes = [System.IO.File]::ReadAllBytes($PSScriptRoot+"\Microsoft.SqlServer.IntegrationServices.Common.ObjectModel.dll")
[System.Reflection.Assembly]::Load($bytes)

$sqlConnectionString = "Data Source=xxx;Initial Catalog=master;Integrated Security=SSPI;"
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection $sqlConnectionString
$SSISNamespace = "Microsoft.SqlServer.Management.IntegrationServices"
$SSIS = New-Object $SSISNamespace".IntegrationServices" $sqlConnection
$catalog = $SSIS.Catalogs["SSISDB"]


$newdbname = "["+$env:NewDatabaseName+"]"

$parameterValueConnectionString = "Data Source=xxxx;Initial Catalog="+$newdbname+";Provider=SQLNCLI11.1;Integrated Security=SSPI;Auto Translate=False;Application Name=DevOps Auotmated Deploy"
$parameterValueInitialCatalogName = $newdbname
$parameterValueXMLPathValue = "\\Data.xml"

$ssisPackage = $catalog.Folders["SomeProject"].Projects["SomePackage"].Packages["Package.dtsx"]

$setValueParameters = New-Object 'System.Collections.ObjectModel.Collection[Microsoft.SqlServer.Management.IntegrationServices.PackageInfo+ExecutionValueParameterSet]';
$executionParameter = New-Object 'Microsoft.SqlServer.Management.IntegrationServices.PackageInfo+ExecutionValueParameterSet';
$executionParameter.ObjectType = 50;
$executionParameter.ParameterName = "SYNCHRONIZED";
$executionParameter.ParameterValue = 1;
$setValueParameters.Add($executionParameter);

$executionParameter = New-Object 'Microsoft.SqlServer.Management.IntegrationServices.PackageInfo+ExecutionValueParameterSet';
$executionParameter.ObjectType = 30;
$executionParameter.ParameterName = "ClientDB_ConnectionString";
$executionParameter.ParameterValue = $parameterValueConnectionString;
$setValueParameters.Add($executionParameter);

$executionParameter = New-Object 'Microsoft.SqlServer.Management.IntegrationServices.PackageInfo+ExecutionValueParameterSet';
$executionParameter.ObjectType = 30;
$executionParameter.ParameterName = "CM.ClientDB.InitialCatalog";
$executionParameter.ParameterValue = $parameterValueInitialCatalogName;
$setValueParameters.Add($executionParameter);

$executionParameter = New-Object 'Microsoft.SqlServer.Management.IntegrationServices.PackageInfo+ExecutionValueParameterSet';
$executionParameter.ObjectType = 30;
$executionParameter.ParameterName = "XMLPath";
$executionParameter.ParameterValue = $parameterValueXMLPathValue;
$setValueParameters.Add($executionParameter);

$ssisPackage.Execute("true", $null, $setValueParameters); 
   
Write-Output "Done"

【讨论】:

    猜你喜欢
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    相关资源
    最近更新 更多