Jam*_*ner 6 sql-server ssis etl sql-job sql-agent
我正在尝试将SQL Server代理作业中的变量值传递给SSIS包,但该变量中包含一个撇号,导致SQL Server代理作业失败
例如,在作业步骤属性的SQL Server代理中,我输入以下详细信息:
Property Path: \Package.Variables[User::VariableName].Properties[Value] Property
Value: Michael O'Callaghan.
Run Code Online (Sandbox Code Playgroud)
知道如何解决这个问题吗?
如果将包部署到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
Run Code Online (Sandbox Code Playgroud)
感谢您的所有建议,但不幸的是它们不起作用,但是我为此构建了一个聪明的解决方法。
SQL Server代理将变量值包装在单引号中,例如在sql server代理中指定Jon Doe,代理将其包装为“Jon Doe”并将其传递给SSIS包,因此如果您要输入带有撇号的值,它将中断 sql server 代理作业并且不会执行 SSIS 包,看起来像这个 EG 传递此值:'John O' Doe' 这将导致代理作业中断,因此您需要将变量值传递为:John O''Doe 和代理将其包装如下:'John O''''Doe' 因此您需要在 SSIS 包中包含以下逻辑:
声明 @TempVar nVarchar(50) SET @TempVar = REPLACE(?, '''''', CHAR(39))
上面的代码创建了一个变量来存储参数值。它将 4 个单引号替换为 1 个。CHAR(39) 是单引号的 ASCII 表示形式。这将导致变量值看起来像 John O'Doe。希望这可以帮助。
我之所以想从代理传递变量值,是因为我必须经常从 SSIS 包中更改变量值,每次都需要部署它。所以这种方式比较快。
| 归档时间: |
|
| 查看次数: |
363 次 |
| 最近记录: |