【问题标题】:Running SSIS package on SQL Server 2019 remotely results in an errorSQL Server 2019远程运行SSIS包报错
【发布时间】:2023-01-14 09:36:05
【问题描述】:

我有几个在 SQL Server 2012 上创建的 SSIS 包。我已经能够将它们导入 SQL Server 2019;但是,当我从我的 .NET 应用程序 (.NET 4.5) 执行包时,出现以下错误:

服务器在处理请求时遇到错误。异常消息是“无法加载文件或程序集‘Microsoft.SqlServer.DTSRuntimeWrap,Version=11.0.0.0,Culture=neutral,PublicKeyToken=89845dcd8080cc91’或其依赖项之一。该系统找不到指定的文件。'。有关详细信息,请参阅服务器日志。

我已经安装了 SSDT 2012 和 SSDT 2019。我还将软件包从 2012 升级到 2019(在较新的 SQL Server 上),但它不起作用。

我还手动将 dll 移动到服务器上的以下路径

C:\Program Files (x86)\Microsoft SQL Server\110\SDK\Assemblies

有人可以帮我弄清楚这里发生了什么吗?

【问题讨论】:

    标签: sql-server ssis


    【解决方案1】:

    TL;博士;

    您需要安装 SQL Server Integration Services服务从 SQL Server 安装在 App 服务器上。不过这不是免费的,因此您很可能需要重新设计工作方式,以便让包在已获得许可的 SQL Server 实例上运行。

    细则

    有两种执行 SSIS 包的方法。

    第一个用于在安装了 SSIS 模板的 Visual Studio 中进行的开发。这会添加一个调试层,这样您就可以对包进行故障排除,目视检查它们等等。这仅在调试模式下运行时适用于 Visual Studio。在没有调试器的情况下运行包失败,因为计算机仅被许可用于开发目的。

    二是系统执行。这是所有其他用例。无论您是通过命令行实用程序、SQL 代理作业、使用 Microsoft SQL Server 程序集的自定义应用程序等运行它,它都是基于使用 SQL Server Integration Services 组件。

    我还手动将 dll 移动到服务器上的以下路径

    所以在这一点上,您正试图让一个 SSIS 包在另一台服务器上运行,但它没有所有的程序集。解决方法是使用 SQL Server 安装介质(标准版或企业版),并安装 SQL Server Integration Services服务在应用程序服务器上。安装程序知道要安装什么以及安装在哪里。

    而且,最重要的是,您将遵守 Microsoft 的许可——好吧,一旦您为这些许可付费。

    您复制程序集并最终进行注册表编辑更改的问题解决方法最终会导致您的程序包从您的应用程序运行,但您的雇主业务现在面临 Microsoft 许可审计的风险。审计的结果不会是“哎呀,你忘了购买这个许可证”,而是“你通过手动安装这些位故意和故意违反条款和条件,并将被罚款”

    请随意阅读许可指南

    https://download.microsoft.com/download/9/c/6/9c6eb70a-8d52-48f4-9f04-08970411b7a3/sql_server_2016_licensing_guide_en_us.pdf

    或者只是窥视相关位

    【讨论】:

    • 感谢@billinkc 提供的信息。我将在 Web 服务器上安装 SSIS 并尝试。我的组织有相同的许可证。但是,作为后续问题。我需要哪个版本? sql server 是 2019,包是在 2012 上构建的,应用程序在 .Net 4.5 上运行
    【解决方案2】:

    更好的计划是在 SQL Server 上安装 SSIS Catalog 中的包,并使用 SSIS Catalog Stored Procedures 远程调用它们

    例如:

    Declare @execution_id bigint
    
    declare @folder_name nvarchar(200) =N'<folder name>';
    declare @project_name nvarchar(200) =N'<project name>';
    declare @package_name nvarchar(200) = N'<package name>.dtsx';
    declare @wait_for_package_completion int = 1;
    DECLARE @logging_level smallint = 3 --3 is verbose
    
    EXEC [SSISDB].[catalog].[create_execution] @package_name=@package_name,
                                               @execution_id=@execution_id OUTPUT,
                                               @folder_name=@folder_name,
                                               @project_name=@project_name,
                                               @use32bitruntime=False,
                                               @reference_id=1,
                                               @useanyworker=True,
                                               @runinscaleout=True
    Select @execution_id
    
    EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  
                                                            @object_type=50,
                                                            @parameter_name=N'LOGGING_LEVEL',
                                                            @parameter_value=@logging_level
    
    EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  
                                                            @object_type=50,
                                                            @parameter_name=N'SYNCHRONIZED',
                                                            @parameter_value=@wait_for_package_completion
    
    EXEC [SSISDB].[catalog].[start_execution] @execution_id,  @retry_count=0
    
    IF 7 <> (SELECT [status] FROM [SSISDB].[catalog].[executions] WHERE execution_id = @execution_id)
      RAISERROR('The package failed. Check the SSIS catalog logs for more information', 16, 1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多