SSIS执行SQL任务 - 来自变量的语句 - 来自表的变量值

时间:2013-05-17 18:44:56

标签: sql ssis execute

民间,

我正在创建包含执行SQL任务的SSIS包。 “SQL Source Type”属性设置为Variable,它使用我的一个包变量。到现在为止还挺好。现在所有这些都包含在“For Each”循环中,该循环从数据库表中读取值。你看,我有一堆表有一堆SQL语句(存储在VARCHAR列中),我想执行它。所有这一切似乎都有效,直到我的表中有一个多行SQL语句。如果有回车,这是我观察到的。假设我将此语句存储在我的表中,我想运行它

IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.MyTable') AND name = N'MyIndex')
DROP INDEX MyTable.MyIndex 

如果我在SSIS包中设置断点,请查看变量的值,该变量的值将填充此sql文本,如下所示(注意\ r \ n):

IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.MyTable') AND name = N'MyIndex')\r\nDROP INDEX MyTable.MyIndex

如果我让它使用Profiler执行并捕获结果,那么实际运行的语句将是\ r \ n的所有内容,换句话说,只有第一行:

IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.MyTable') AND name = N'MyIndex')

这显然不是我想要的。我需要运行的实际语句要复杂得多,并且希望保持格式良好,因此可以在必要时进行可视化检查。这是我遇到的已知限制,是否有任何解决方法?

谢谢!

2 个答案:

答案 0 :(得分:1)

解决方法#1:请参阅有关将T-SQL代码转换为一行并在此处再次转换的方法的讨论:Format TSQL onto one line

答案 1 :(得分:0)

感谢您提供有关使用Notepad ++解包行的建议。这很好知道。

然而,我的问题是一个自我造成的问题。即使我尝试执行的查询包含新行,SSIS也能正常工作。令我感到困惑的是,在IF EXISTS()计算结果为FALSE的情况下,后续语句将不会执行,也不会显示在探查器跟踪中。例如,如果你要运行它:

IF 1 = 0 SELECT 'No Way'

您只会在跟踪输出中看到“IF 1 = 0”。我把这个结果误解为回车问题。误报!