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

Posted

技术标签:

【中文标题】SSIS 执行 SQL 任务 - 来自变量的语句 - 来自表的变量值【英文标题】:SSIS Execute SQL Task - Statement from Variable - Variable value from a table 【发布时间】:2013-05-17 18:44:56 【问题描述】:

伙计们,

我正在创建 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')

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

谢谢!

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

IF 1 = 0 SELECT 'No Way'

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

【讨论】:

欢迎。很高兴这对你来说不是问题。我也有兴趣阅读上一个关于如何在一行中格式化代码并再次返回的问题。

以上是关于SSIS 执行 SQL 任务 - 来自变量的语句 - 来自表的变量值的主要内容,如果未能解决你的问题,请参考以下文章

如果存储过程失败,则在执行 SQL 任务中将输出变量值获取到 ssis 变量中

是否可以从SSIS源动态创建表

在 SSIS 的脚本任务中使用变量

从 SSIS 调用时删除语句失败

SSIS和NULL值

使用 ssis 包在 SQL Server 代理作业中找不到存储过程错误