0

伙计们,

我正在创建 SSIS 包,其中包含执行 SQL 任务。“SQL 源类型”属性设置为变量,它使用我的包变量之一。到目前为止,一切都很好。现在所有这些都包含在“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 之前的所有内容,换句话说,只有第一行:

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

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

谢谢!

4

2 回答 2

1

解决方法 #1:请参阅有关将 T-SQL 代码转换为一行并在此处再次转换回来的方法的讨论:将TSQL 格式化为一行

于 2013-05-17T20:29:17.690 回答
0

感谢您关于使用 Notepad ++ 展开行的建议。很高兴知道这一点。

然而,我的问题是自找的。即使我尝试执行的查询包含新行,SSIS 也可以正常工作。让我感到困惑的是,如果 IF EXISTS () 评估为 FALSE,后续语句将不会被执行,也不会出现在分析器跟踪中。例如,如果你要运行这个:

IF 1 = 0 SELECT 'No Way'

您只会在跟踪输出中看到“IF 1 = 0”。我将此结果误解为回车的问题。虚惊!

于 2013-05-17T22:51:10.373 回答