我在 SSIS 2012 中有一个包含大约 150 个包的项目。其中一个是入口点,其余的在主线的某个地方被调用。如果一个表不存在,他们每个人都会在目标中创建自己的表。我发现我需要将 DelayValidation 设置为 True 才能工作,但讨厌做 150 次的工作。除了对所有包进行更改之外,有没有办法传播此属性或其他任何方法?
3 回答
您可以使用 .NET 库进行此更改。下面是一个 PowerShell 脚本,它查看给定文件夹中的所有包。如果该DelayValidation
属性为 false,则将其更改为 True 并保存包。
[Reflection.Assembly]::LoadWithPartialName("Microsoft.SQLServer.ManagedDTS") | Out-Null
$folder = "C:\sandbox\StackOverflow\StackOverflow\obj\Development"
$app = New-Object Microsoft.SqlServer.Dts.Runtime.Application
foreach($current in (Get-ChildItem $folder -Filter "*.dtsx").FullName)
{
Write-Host $current
$package = $app.LoadPackage($current, $null)
if ($package.DelayValidation -eq $false)
{
$package.DelayValidation = $true
$app.SaveToXml($package, $null)
}
}
注意事项
- 永远不要在没有测试你有版本控制的情况下运行自动化代码。
- 这只会更改包的 DelayValidation。每个 Container 和 Task 都有自己的 DelayValidation 属性,可能需要更新
2017+ 备注
一位用户指出
SQL Server 2017 中的 SaveToXml 函数需要 3 个参数。
这会让这个SaveToXml
看起来像
$app.SaveToXml($current, $package, $null)
文档表明自 2016年以来一直如此。
他们进一步指出,
作为没有像我一样安装 SQL Server 的开发人员,需要明确找到您的 Microsoft.SQLServer.ManagedDTS.dll 文件
这会将第一行的LoadWithPartialName
LoadFile 替换为显式路径,例如
([Reflection.Assembly]::LoadFile("C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\SSIS\140\Binn\Microsoft.SqlServer.ManagedDTS.dll") | Out-Null)
请注意,确切的路径将根据您安装的工具而有所不同。我倾向于使用dir /s /b
(目录,搜索子文件夹,裸格式)命令来查找东西
C:\>cd "\Program Files (x86)"
C:\Program Files (x86)>dir /s /b Microsoft.SqlServer.ManagedDTS.dll
C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\CommonExtensions\Microsoft\SSIS\150\Binn\Microsoft.SqlServer.ManagedDTS.dll
C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\PublicAssemblies\SSIS\150\Microsoft.SqlServer.ManagedDTS.dll
在这里我们可以看到我有两个 ManagedDTS.dll 都用于 SQL Server 的 150(2019?)版本
我找到了更快的方法,即在每个单独包的代码中查找DelayValidation">0<
和替换DelayValidation">-1<
。它比逐项更改属性要快,但是您仍然必须为每个包执行此操作。
将 DelayValidation">0 设置为 DelayValidation">-1 在 SSIS 2008 和 SSIS 2008 R2 中有效,但在 SSIS 2012 中不存在。默认情况下,SSIS 2012 中的组件没有项目 - DTS:DelayValidation。将组件的 DelayValidation 设置为 True 后,将添加以下内容 - DTS:DelayValidation="True"。我正在使用 Visual Studio Ultimate 2012。