在 SQL Server 中引发错误串联

use*_*655 3 sql-server

第 1 步:我在 sys.messages 中创建了自定义错误消息

EXEC sp_addmessage   
    @msgnum = 50001,   
    @severity = 10,  
    @msgtext =   
        N'Error 50001, severity 10, state 1 was raised, Please check mdf file.' ,  
    @lang = 'us_english',
    @replace='REPLACE';
Run Code Online (Sandbox Code Playgroud)

第 2 步:在满足条件时在 Job 内部引发错误

RAISERROR(50001, 10,1,@freespacePct, @dbname,@drive) with LOG;
Run Code Online (Sandbox Code Playgroud)

我想在错误消息中看到 FreespacePCt、数据库名称和驱动器详细信息。

但是当我查看引发的错误时,我只看到了我在sp_addmessage. 如何记录其他详细信息?

我看到的消息:

错误 50001,严重性 10,状态 1 已引发,请检查 mdf 文件。

scs*_*mon 6

您需要向 @msgtext 添加一些参数,以便 SQL Server 知道您将数据放在哪里。像这样:

EXEC sp_addmessage   
    @msgnum = 50001,   
    @severity = 10,  
    @msgtext =   
        N'Error 50001, severity 10, state 1 was raised, Please check mdf file. The freespace is %d percent for %s residing on %s' ,  
    @lang = 'us_english',
    @replace='REPLACE';
Run Code Online (Sandbox Code Playgroud)

然后,你会提出它......

declare @freespacePct int = 45
        ,@dbname sysname = 'MYDB'
        ,@drive varchar(16) = 'F:/'
RAISERROR(50001, 10,1,@freespacePct, @dbname,@drive) with LOG;
Run Code Online (Sandbox Code Playgroud)

那将返回:

错误 50001,严重性 10,状态 1 已引发,请检查 mdf 文件。位于 F:/ 上的 MYDB 的可用空间为 45%

%s用于字符串,%d用于符号整数。您可以在RAISERROR 文档中找到所有类型规范。

Type specification  Represents
d or i              Signed integer
o                   Unsigned octal
s                   String
u                   Unsigned integer
x or X              Unsigned hexadecimal
Run Code Online (Sandbox Code Playgroud)

这些类型规范基于最初为C 标准库中的printf函数定义的类型规范。RAISERROR 消息字符串中使用的类型规范映射到 Transact-SQL 数据类型,而 printf 中使用的规范映射到 C 语言数据类型。当 Transact-SQL 没有与关联的 C 数据类型类似的数据类型时,RAISERROR 不支持 printf 中使用的类型规范。例如,RAISERROR 不支持指针的 %p 规范,因为 Transact-SQL 没有指针数据类型。