Sql server 2008 错误处理的SQLCmd脚本中的DDL命令;没有Try/Catch块不存在的语法错误

Sql server 2008 错误处理的SQLCmd脚本中的DDL命令;没有Try/Catch块不存在的语法错误,sql-server-2008,try-catch,ddl,sqlcmd,Sql Server 2008,Try Catch,Ddl,Sqlcmd,我对SQL Server还比较陌生,但喜欢它的很多方面,除了一系列稍有不同但没有一个可以做任何事情的脚本选项,在不同的方式上都很挑剔,当您觉得自己开始掌握一些东西并在巡游时,您会遇到另一个障碍。我一直在研究动态SQL,发现了对生命周期短的变量的限制,根据我之前收到的建议,我现在正尝试编写sqlcmd脚本 如果你赤裸裸地运行,很多脚本都可以很好地运行。然而,当您将其中的一些命令放入Try/Catch块以对其执行错误处理时,您经常会遇到荒谬的限制,最明显的是DDL命令,它们必须是单独的,并且必须是批

我对SQL Server还比较陌生,但喜欢它的很多方面,除了一系列稍有不同但没有一个可以做任何事情的脚本选项,在不同的方式上都很挑剔,当您觉得自己开始掌握一些东西并在巡游时,您会遇到另一个障碍。我一直在研究动态SQL,发现了对生命周期短的变量的限制,根据我之前收到的建议,我现在正尝试编写sqlcmd脚本

如果你赤裸裸地运行,很多脚本都可以很好地运行。然而,当您将其中的一些命令放入Try/Catch块以对其执行错误处理时,您经常会遇到荒谬的限制,最明显的是DDL命令,它们必须是单独的,并且必须是批处理中的第一条/唯一一条语句。Go在这种上下文中是无用的,因为如果将它放在Try/Catch块中的任何位置,它保证您将得到语法错误

很明显,我已经在网上搜索过这篇文章,并且看到了一些在编辑这篇文章时出现的类似问题,但我还是不断地给出一些例子,这些例子要么是上述意义上的赤裸裸的,要么是没有这些限制的代码上的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
自己运行这个就可以了。将“开始尝试”放在它前面,将“结束尝试”放在它后面,并在它后面放置一个捕捉块,您将获得:

信息156,第15级,状态1,第3行 关键字“触发器”附近的语法不正确

在BEGIN上有一条红色的曲线,并且在BEGIN附近有一个虚假的工具提示,语法不正确,需要外部的

我再次尝试了sp_executesql路径,但:

首先,它还在$error附近生成了一个虚假的语法错误,这与告诉我在这里和Zargthorp星球之间的某个地方存在一些语法错误一样有用,但更重要的是:

第二,即使我真的让它为这样一个相对简单的触发器工作,我也在做噩梦,试图想象以这种方式包装一个复杂的多行触发器,但即使我真的通过了它

第三,它会使代码变得更加模糊,并挫败了首先使用脚本的目的之一,即自我文档化

因此,我的问题是:

Try/Catch对于命令来说实际上是无用的,因为MS设计人员最熟悉的原因,这些命令需要像Create Trigger一样独立存在,而不是像Create Schema这样的一行程序,可以整齐地打包到sp_executesql中;或

在我的《相对新手》中,我是否错过了一些其他方法来解决我在创建触发器时遇到的限制


提前感谢您的回复。

我很惊讶以前没有人遇到过这个问题,但至少它为我赢得了一枚风滚草徽章。8^>值得一提的是,我实现这一点的方法是将触发器创建分离到一个单独的更新表脚本中,该脚本不做任何其他事情,并且省略了对它的错误处理。我可以处理主脚本中的所有错误。这并不漂亮,但它完成了任务…我很惊讶以前没有人遇到过这个问题,但至少它为我赢得了一枚风滚草徽章。8^>值得一提的是,我实现这一点的方法是将触发器创建分离到一个单独的更新表脚本中,该脚本不做任何其他事情,并且省略了对它的错误处理。我可以处理主脚本中的所有错误。这并不漂亮,但它完成了任务。。。