为什么在 THROW 消息中禁止使用 % 字符?

DiG*_*iGi 7 sql-server

简单的问题:

THROW 50000, 'Because of this ->%<- is this message invisible.', 1;
Run Code Online (Sandbox Code Playgroud)
  • 你不能像 RAISERROR 一样传递 %s, %d 参数
  • 你必须使用FORMATMESSAGE
  • 但是如果 % 没有加倍(正确显示),则 THROW 无论如何都会失败

在 Microsoft SQL Server 2012 (SP1) 11.0.3381.0 (X64)、11.0.3000.0 (X64) 上测试


现实世界的例子:

DECLARE @ProcParam VARCHAR(30) = 'Hehe%x!';
DECLARE @Message VARCHAR(500) = FORMATMESSAGE('Procedure input %s is wrong', @ProcParam);
PRINT 'Message: ' + @Message;
THROW 50000, @Message, 1;
Run Code Online (Sandbox Code Playgroud)

Ken*_*her 1

看来他们printf在 THROW 命令中保留了功能(或至少是部分功能),但没有包含向其传递参数的方法。我尝试了 BOL 中列出的每个字符作为可能的“类型%(d, i, o, s, x, X, or u),每个字符都返回一个空白。% 之后的任何其他字符都会返回有效的字符串。我的猜测是他们正在用 a 替换该值,这NULL当然会导致任何字符串连接返回 aNULL并且打印时看起来为空白。

不幸的是,如果没有背后的代码(或至少是微软开发人员)来确认,就无法确定。