3

我在 SSIS 2012 中有一个包含大约 150 个包的项目。其中一个是入口点,其余的在主线的某个地方被调用。如果一个表不存在,他们每个人都会在目标中创建自己的表。我发现我需要将 DelayValidation 设置为 True 才能工作,但讨厌做 150 次的工作。除了对所有包进行更改之外,有没有办法传播此属性或其他任何方法?

4

3 回答 3

2

您可以使用 .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 文件

这会将第一行的LoadWithPartialNameLoadFile 替换为显式路径,例如

 ([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?)版本

于 2013-10-14T20:03:10.063 回答
0

我找到了更快的方法,即在每个单独包的代码中查找DelayValidation">0<和替换DelayValidation">-1<。它比逐项更改属性要快,但是您仍然必须为每个包执行此操作。

于 2016-04-19T10:08:47.900 回答
0

将 DelayValidation">0 设置为 DelayValidation">-1 在 SSIS 2008 和 SSIS 2008 R2 中有效,但在 SSIS 2012 中不存在。默认情况下,SSIS 2012 中的组件没有项目 - DTS:DelayValidation。将组件的 DelayValidation 设置为 True 后,将添加以下内容 - DTS:DelayValidation="True"。我正在使用 Visual Studio Ultimate 2012。

于 2018-11-07T23:35:40.050 回答