代码之家  ›  专栏  ›  技术社区  ›  John McElreavey

SQL Server Integration Services(SQL Server 2016)(SSIS)是否在每次运行C#代码时都重新编译它,还是将其缓存?

  •  1
  • John McElreavey  · 技术社区  · 6 年前

    最近,我遇到了一个奇怪的问题,其中一些变量在DTSX包的C#任务中分配不正确,但没有导致安装在SQL Server 2012上的SSIS出错,但在SQL Server 2016上确实出错。

    基本上,错误如下所示:

        Variables.ContainerDisable100 = C100;
        Variables.ContainerDisable101 = C101;
        Variables.ContainerDisable102 = C102;
        Variables.ContainerDisable102 = C103;
    

    正如您所看到的变量。ContainerDisable102应该是变量。集装箱Disable103。这将导致错误,并在运行dtsx包时执行dtsx包。然而,由于我们使用的是SQL Server 2012,这并没有在本地环境中造成问题,但是在SQL Server 2016上,这导致了预期的错误。

    我的理论是,有人使用记事本++而不是数据工具更新了这个dtsx包中的C代码。这意味着C代码没有被重新编译,当SQL Server 2012运行编译后的代码时,它工作正常。

    这就引出了我的问题,SQL Server 2016 SSI是否仍在查看已编译的代码,还是查看未编译的C代码?

    这是一个非常奇怪的问题,这是我唯一的预感。当我在data tools中手动打开C#任务时,做了一个小的更改并构建并保存了它,然后在SQL Server 2012中出现了错误,这让我相信它以前没有正确构建,或者是通过XML更新的。

    使现代化

    因此,我已经确认客户安装运行的是C代码,而不是预编译的二进制文件。设置如下:

    • SQL Server 2016
    • SQL Server Integration Services 13.0

    当我用记事本++更新dtsx,只更新C代码并使用SQL Server作业代理运行包时,它会失败。不应该是这种情况,因为它应该查看预编译的二进制文件。我在Microsofts的最新页面中看不到任何与此相关的内容。

    1 回复  |  直到 4 年前
        1
  •  1
  •   John McElreavey    6 年前

    这是一个大海捞针式的问题,但我已经弄清了真相。

    我上面提到的包中有一个bug,但是这个bug没有编译并存储在dtsx中,这意味着在本地运行时我没有收到错误。

    我的本地安装使用

    • SQL Server 2012
    • SQL Server Integration Services 11.0

    然而,当客户尝试执行这些包时,他们收到了错误。设置如下:

    • SQL Server 2016
    • SQL Server Integration Services 13.0

    他们正在运行的包是在SQL Server Data Tools 2010中开发的,目标版本为SQL Server 2012。它们未更新为与SQL Server 2016一起运行。

    执行这些包时 dtexec Utility 足够聪明,可以看到版本不匹配,并临时升级包以运行它。当它升级包时,会重新编译C代码,这反过来又会导致错误。

    我认为在构建C#脚本任务的过程中出现了问题,或者开发人员通过dtsx XML手动更新了C#代码,这意味着预编译的C#从未重新编译过,从而导致发现了此问题。

    我希望这有助于其他人在将来避免这个问题。