SQL Server代理和SSIS包

时间:2019-02-20 17:02:20

标签: 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.

有什么办法解决此问题吗?

5 个答案:

答案 0 :(得分:5)

如果将程序包部署到SSISDB并从那里执行,则使用SSISDB存储过程来设置值并像使用T-SQL一样对引号进行转义。然后,SQL Agent作业可以在该步骤中使用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

答案 1 :(得分:4)

退出。只需使用双撇号即可。 '' (不是引号",而是撇号撇号)

答案 2 :(得分:2)

尝试维护配置文件的标准方法(如果使用的是2008年或更晚版本),并将变量值通过该文件传递。

答案 3 :(得分:1)

处理此问题的另一种方法,坦率地说,我认为最好的方法是使用环境变量。据我所知,这是在Microsoft推出SQL Server 2012项目部署模型以替代程序包部署模型时引入的。程序包部署模型要求在单独的XML文件中指定程序包参数,以将其部署到服务器。通过项目部署模型,Microsoft在SQL Server中创建了一个用户友好的用户界面来进行管理-XML文件已被删除。

简而言之,环境变量允许开发人员将程序包参数(而不是程序包本身内部的程序包变量)链接到SQL Server,从而将其暴露在服务器上,但不能将程序包参数链接到SQL Server。这使得跨软件包存在的相同软件包参数的管理(例如,连接管理器,FQDN格式的网络文件夹位置等)非常容易管理。这里的想法是,如果需要将软件包指向新的服务器或新的网络文件夹,则开发人员可以简单地在SQL Server中更改单个值,然后将不需要推广到所有软件包打开,更改和重新部署程序包。

有关如何执行此操作的详细步骤,请参阅以下参考文献:

微软:这有点干,但是很全面,从马的嘴里可以看到。

SQL Chick::更加直观,并提供了屏幕快照,我认为这很有帮助。

答案 4 :(得分:1)

感谢您的所有建议,但很遗憾,这些建议没有用,但是我为此制定了一个聪明的解决方法。

SQL Server代理将变量值包装在单引号中,例如在sql服务器代理中指定Jon Doe,该代理将其包装为“ Jon Doe”,然后将其传递给SSIS包,因此,如果要使用撇号将破坏sql server agent的工作,并且不会执行SSIS包,它看起来像是EG传递了此值:'John O'Doe'这将导致代理工作中断,因此您需要传递变量值as:John O''Doe,代理将其包装如下:'John O''''Doe',因此您需要在SSIS包中包括以下逻辑:

声明@TempVar nVarchar(50) SET @TempVar = REPLACE(?,``'''',CHAR(39))

上面的代码创建一个变量来存储参数值。它将4个单引号替换为一个。 CHAR(39)是单引号的ASCII表示形式。 然后,这将导致变量值看起来像John O'Doe。 希望这会有所帮助。

之所以我想从代理传递变量值的原因是,我不得不经常从SSIS包中更改变量值,因此每次都需要部署它。所以这种方式更快。<​​/ p>