SQL 服务器代理和 SSIS 包
SQL Server Agent and SSIS packages
我正在尝试将变量值从 SQL Server Agent 作业传递到 SSIS 程序包,但变量中包含一个撇号,导致 SQL Server Agent 作业失败
例如,在作业步骤属性的 SQL 服务器代理中,我输入以下详细信息:
Property Path: \Package.Variables[User::VariableName].Properties[Value] Property
Value: Michael O'Callaghan.
知道如何解决这个问题吗?
如果将包部署到 SSISDB 并从那里执行,请使用 SSISDB 存储过程设置值并像通过 T-SQL 一样转义引号。然后 SQL 代理作业可以使用 T-SQL 脚本代替此步骤。下面的示例使用 set_execution_parameter_value
存储过程来设置此值,并且仍然会导致传入 "Michael O'Callaghan"。
DECLARE @execution_id BIGINT
EXEC [SSISDB].[catalog].[create_execution] @package_name=N'Package.dtsx', @execution_id=@execution_id OUTPUT,
@folder_name=N'Project Folder', @project_name=N'Project', @use32bitruntime=False, @reference_id=Null
DECLARE @var0 SQL_VARIANT = N'Michael O''Callaghan'
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id, @object_type=30, @parameter_name=N'Name', @parameter_value=@var0
DECLARE @var1 SMALLINT = 1
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id, @object_type=50, @parameter_name=N'LOGGING_LEVEL', @parameter_value=@var1
EXEC [SSISDB].[catalog].[start_execution] @execution_id
逃避它。只需使用双撇号。 ''
(不是引号"
,而是撇号撇号).
尝试维护配置文件的标准方法(如果您使用的是 2008 或更低版本)并通过文件传递变量值。
处理此问题的另一种方法,坦率地说,我认为最好的方法是使用环境变量。据我所知,这是在 Microsoft 推出带有 SQL Server 2012 的项目部署模型以替代包部署模型时引入的。包部署模型要求在要部署到服务器的单独 XML 文件中指定包参数。通过项目部署模型,Microsoft 在 SQL 服务器中创建了一个用户友好的用户界面来管理它 - XML 文件已被删除。
简而言之,环境变量允许开发人员link 打包参数,但不能打包变量,因为它们是包本身的内部变量,SQL服务器,从而将它们暴露在服务器上。这使得管理跨包存在的相同包参数(例如,连接管理器、FQDN 格式的网络文件夹位置等)变得非常容易管理。这里的想法是,如果包需要指向一个新的服务器或新的网络文件夹,那么开发人员可以简单地更改 SQL 服务器中的单个值,然后传播到所有包 而无需 需要打开、更改和重新部署包。
有关如何执行此操作的详细步骤,请参阅以下参考资料:
微软:这个有点干,但是很全面,出自马口。
SQL 小妞: 更直观,并提供截图,我觉得很有帮助。
感谢您的所有建议,但不幸的是它们没有用,但是我为此构建了一个巧妙的解决方法。
SQL 服务器代理将变量值用单引号包装起来,例如在 sql 服务器代理中指定 Jon Doe,代理将它包装成这样 'Jon Doe' 并将其传递给 SSIS 包,所以如果你输入一个带有撇号的值,它会破坏 sql 服务器代理作业并且不会执行 SSIS 包它看起来像这样 E.G 传递这个值:'John O' Doe' this会导致代理工作中断,因此您需要将变量值传递为:John O''Doe,代理将其包装如下:'John O''''Doe' 因此您需要包含SSIS 包中的以下逻辑:
声明@TempVar nVarchar(50)
SET @TempVar = REPLACE(?, '''''', CHAR(39))
以上代码创建了一个变量来存储参数值。它将 4 个单引号替换为一个。 CHAR(39) 是单引号的 ASCII 表示。
这会导致变量值看起来像 John O'Doe。
希望这有帮助。
我想从代理传递变量值的原因是我必须经常从 SSIS 包中更改变量值,每次都需要部署它。所以这种方式更快。
我正在尝试将变量值从 SQL Server Agent 作业传递到 SSIS 程序包,但变量中包含一个撇号,导致 SQL Server Agent 作业失败
例如,在作业步骤属性的 SQL 服务器代理中,我输入以下详细信息:
Property Path: \Package.Variables[User::VariableName].Properties[Value] Property
Value: Michael O'Callaghan.
知道如何解决这个问题吗?
如果将包部署到 SSISDB 并从那里执行,请使用 SSISDB 存储过程设置值并像通过 T-SQL 一样转义引号。然后 SQL 代理作业可以使用 T-SQL 脚本代替此步骤。下面的示例使用 set_execution_parameter_value
存储过程来设置此值,并且仍然会导致传入 "Michael O'Callaghan"。
DECLARE @execution_id BIGINT
EXEC [SSISDB].[catalog].[create_execution] @package_name=N'Package.dtsx', @execution_id=@execution_id OUTPUT,
@folder_name=N'Project Folder', @project_name=N'Project', @use32bitruntime=False, @reference_id=Null
DECLARE @var0 SQL_VARIANT = N'Michael O''Callaghan'
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id, @object_type=30, @parameter_name=N'Name', @parameter_value=@var0
DECLARE @var1 SMALLINT = 1
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id, @object_type=50, @parameter_name=N'LOGGING_LEVEL', @parameter_value=@var1
EXEC [SSISDB].[catalog].[start_execution] @execution_id
逃避它。只需使用双撇号。 ''
(不是引号"
,而是撇号撇号).
尝试维护配置文件的标准方法(如果您使用的是 2008 或更低版本)并通过文件传递变量值。
处理此问题的另一种方法,坦率地说,我认为最好的方法是使用环境变量。据我所知,这是在 Microsoft 推出带有 SQL Server 2012 的项目部署模型以替代包部署模型时引入的。包部署模型要求在要部署到服务器的单独 XML 文件中指定包参数。通过项目部署模型,Microsoft 在 SQL 服务器中创建了一个用户友好的用户界面来管理它 - XML 文件已被删除。
简而言之,环境变量允许开发人员link 打包参数,但不能打包变量,因为它们是包本身的内部变量,SQL服务器,从而将它们暴露在服务器上。这使得管理跨包存在的相同包参数(例如,连接管理器、FQDN 格式的网络文件夹位置等)变得非常容易管理。这里的想法是,如果包需要指向一个新的服务器或新的网络文件夹,那么开发人员可以简单地更改 SQL 服务器中的单个值,然后传播到所有包 而无需 需要打开、更改和重新部署包。
有关如何执行此操作的详细步骤,请参阅以下参考资料:
微软:这个有点干,但是很全面,出自马口。
SQL 小妞: 更直观,并提供截图,我觉得很有帮助。
感谢您的所有建议,但不幸的是它们没有用,但是我为此构建了一个巧妙的解决方法。
SQL 服务器代理将变量值用单引号包装起来,例如在 sql 服务器代理中指定 Jon Doe,代理将它包装成这样 'Jon Doe' 并将其传递给 SSIS 包,所以如果你输入一个带有撇号的值,它会破坏 sql 服务器代理作业并且不会执行 SSIS 包它看起来像这样 E.G 传递这个值:'John O' Doe' this会导致代理工作中断,因此您需要将变量值传递为:John O''Doe,代理将其包装如下:'John O''''Doe' 因此您需要包含SSIS 包中的以下逻辑:
声明@TempVar nVarchar(50) SET @TempVar = REPLACE(?, '''''', CHAR(39))
以上代码创建了一个变量来存储参数值。它将 4 个单引号替换为一个。 CHAR(39) 是单引号的 ASCII 表示。 这会导致变量值看起来像 John O'Doe。 希望这有帮助。
我想从代理传递变量值的原因是我必须经常从 SSIS 包中更改变量值,每次都需要部署它。所以这种方式更快。