2014-09-19 66 views
2

SSIS中有趣的行为。我在2005年开发了一个dtsx包。其中一个执行SQL任务有一个CTE语句。这是该块中唯一的声明。当我在2005年调试包时,一切正常。但是,当我在部署到服务器后将包作为工作运行时,出现错误,指出关键字“with”附近的语法不正确。SSIS中CTE之前缺少分号

它工作得很好,但是当我在with语句之前放一个分号。现在我知道CTE之前的陈述需要用分号结束,并且养成了总是终止我所有陈述的习惯......但是在CTE之前没有任何陈述。我甚至检查过可能已经运行的其他任何执行SQL任务,并且所有的语句都被正确终止。这是SQL 2008R2中运行的2005包。

所以它现在工作正常,但我仍然不知道为什么会发生这种情况。有没有人有任何想法?

+1

当你通过一个工作来运行这个包时,我猜想一些sql查询是在执行sql任务之前执行的。所以你需要在cte之前使用终结符,并且总是建议使用;在cte之前。 – 2014-09-19 09:30:46

+6

您可以使用SQL事件探查器来捕获程序包运行时发送的sql语句吗?查看SSIS是否将批处理中的其他语句放入执行SQL任务中会很有趣。 – 2014-09-19 10:09:18

+2

当然。好主意马克。和拉姆,我想知道的一样,是的,你是对的。作为一项工作运行时,代理似乎已将这些CTE放在同一个SPID中。 1)exec sp_oledb_ro_usrname 2)select collat​​ionname(0x0904D00000) 3); myCTE as .....; 谢谢你们:) – ScubaManDan 2014-09-19 13:28:30

回答

1

感谢您的建议马克。是的,当作为一项工作运行时,代理似乎已将这些CTE放在同一个SPID中。

  1. EXEC sp_oledb_ro_usrname
  2. 选择collat​​ionname(0x0904D00000)
  3. ;具有myCTE如.....;

所以一个和两个不会被终止,这意味着第三个语句(作为CTE)需要以分号作为前缀工作。有点烦人,但好的...