在 SQLCLR 中使用系统 message_id 引发错误

Jus*_*ing 6 sql-server sql-server-2008-r2 error-handling

如果调用CREATE DATABASE foo两次,我会收到错误消息:

Msg 1801, Level 16, State 3, Line 1
Database 'dropme' already exists. Choose a different database name.
Run Code Online (Sandbox Code Playgroud)

错误消息列在sys.messages 中

SELECT * FROM sys.messages WHERE message_id = 1801 AND language_id = 1033
Run Code Online (Sandbox Code Playgroud)

我有一个 SQLCLR 过程,它基本上可以执行CREATE DATABASE FOR ATTACH. 它一开始就知道创建的数据库的名称,但在附加之前做了很多工作。因此,我想在继续之前确保数据库不存在,如果存在则给出该错误。

如果我尝试在该消息上使用RAISERROR(1801, 16, 1)它不会让我:

Msg 2732, Level 16, State 1, Line 1
Error number 1801 is invalid. The number must be from 13000 through 2147483647 and it cannot be 50000.
Run Code Online (Sandbox Code Playgroud)

除了引发错误并使 msg_id 为 50000 之外,我还有其他选择吗?

Jon*_*gel 3

除了引发错误并让 msg_id 为 50000 之外,我还有其他选择吗?

您可以定义 id > 50000 的自定义消息,也可以选择不定义消息并使用 id = 50000。用户不能提出内部错误号,因为允许这样做会导致各种滥用。 ..

如何实现这一点实际上取决于您的环境,因此我不确定我们是否可以就这种情况下的操作提供建议。

内置方法的一种替代方法(我讨厌自定义消息在实例中是全局的)有点开箱即用,并且可能合适也可能不合适,那就是使用默认消息 id 引发错误50000,并在消息本身中返回自定义错误代码(带或不带实际错误消息)。这将使您可以在 SQL Server 上下文之外本地化消息,同时仍然保留捕获特定类型消息的能力。(注意:如果您有某种处理错误的客户端框架,则最好这样做。)缺点是调用者通常不期望这种行为。