处理错误的DDL命令处理SQLCmd脚本;没有Try / Catch块的情况下不存在的语法错误

时间:2012-06-01 20:00:46

标签: sql-server-2008 try-catch ddl sqlcmd

我仍然相对较新的SQL Server,但是喜欢它的很多东西,除了“所有稍微不同但不能做任何事情”的阵列,“挑剔的不同”通过“脚本选项”,当你觉得自己已经开始处理事情并且正在巡航时,你会闯入另一个障碍。我一直在动态SQL路径上(并且已经找到了对生命周期较短的变量的限制),并且根据之前的建议我收到了(Script to create a schema using a variable),现在我正在尝试编写sqlcmd脚本。

如果你“赤身裸”地运行它们,许多脚本都能正常工作。但是,只要将其中的一些放入Try / Catch块来实现对它们的错误处理,您就会遇到一些荒谬的限制,尤其是DDL命令,这些命令“无法独立”并且需要成为第一个/唯一的声明。一批。 Go在这种情况下是无用的,因为如果你把它放在Try / Catch块中的任何地方,它可以保证你会得到一个语法错误。

显然我已经在网上搜索过了(并且看过编辑这篇文章时出现的一些“类似问题”)但是继续提出上面意义上的“裸”的例子,或者是尝试/捕获没有这些限制的代码示例。

在创建模式的情况下,我使用了为动态SQL建议的方法;我通过sp_executesql运行它。这不是问题,因为它本质上是一行代码,问题是当我尝试在表上创建触发器时再次点击它(并且我猜测我将使用其他一些Create命令)。

CREATE TRIGGER MySchema.NoDelete 
    ON  MySchema.MyTable 
INSTEAD OF DELETE
AS 
    BEGIN
    SET NOCOUNT ON;
    RAISERROR ('Deletions are not allowed on this table', 16,1)
END

自己运行它没关系。在它开始之前尝试并尝试结束尝试和一个Catch块之后你得到:

  

第15行,第1行,第3行   关键字“TRIGGER”附近的语法不正确。

在BEGIN上有一条红色波浪线,伪造的工具提示“在Begin附近语法不正确,期待外部”。

我再次尝试使用sp_executesql路径但是:

  • 首先,它还会产生一个虚假的“语法错误接近$”错误,这有点像告诉我某处语法错误,在某处,在这里和Zargthorp行星之间“但更重要的是:

  • 其次,即使我确实让它为像这样的一个相对微不足道的触发器工作,我也在做噩梦试图以这种方式包装一个复杂的多线触发器,但即使我说过去那个;

  • 第三,它会使代码更加模糊,并且首先失败了使用脚本的目的之一,那就是自我记录。

我的问题是:

  • Try / Catch对于命令是否有效无用,这些命令由于MS设计人员最熟悉的原因,需要像创建触发器一样生活在孤立的威严之中(并且它不是像Create Schema这样可以整齐打包的单行程序到sp_executesql);或

  • 在我的相对新手中,我是否错过了一些其他方法来解决我使用创建触发器进行的限制?

提前感谢您的回复。

0 个答案:

没有答案