2

我对 SQL Server 还是比较陌生,但我喜欢它的很多东西,除了“all-slightly-different-but-none-can-do-everything”、“finicky-in-different-ways”的数组脚本选项,当你觉得你开始处理事情并且正在巡航时,你又遇到了另一个障碍。我一直在使用动态 SQL 路径(并且发现了对生命周期短的变量的限制),并且根据我之前收到的建议(使用变量创建模式的脚本),现在我正在尝试编写 sqlcmd 脚本。

如果你“赤裸”地运行它们,很多脚本都可以正常工作。但是,一旦您将其中一些放入 Try / Catch 块中以对它们进行错误处理,您经常会遇到荒谬的限制,最明显的是 DDL 命令,这些命令“独自一人”并且需要成为第一个/唯一的语句一批。Go 在这种情况下是没有用的,因为如果你把 THAT 放在 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

自己运行它就可以了。把 Begin Try 放在它前面,End Try 和一个 Catch 块放在它后面,你会得到:

消息 156,级别 15,状态 1,第 3 行关键字“TRIGGER”附近的语法不正确。

在 BEGIN 上有一条红色的波浪线,带有虚假的工具提示“Begin 附近的语法不正确,需要外部”。

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

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

  • 其次,即使我确实让它适用于像这样的相对微不足道的触发器,我也会做噩梦,试图想象以这种方式包装一个复杂的多线触发器,但即使我确实做到了;

  • 第三,它会使代码更加晦涩难懂,并首先破坏了使用脚本的目的之一,即自我记录。

因此,我的问题是:

  • Try/Catch 对那些因为 MS 设计人员最熟悉的原因需要像 Create Trigger 这样的孤立威严的命令(而不是像 Create Schema 那样可以整齐地打包到 sp_executesql 中的单行)的命令是否有效地无用;或者

  • 在我的相对新手中,我是否错过了一些其他方法来解决我在 Create Trigger 中遇到的那种限制?

提前感谢您的任何回复。

4

0 回答 0