gpt4 book ai didi

sql-server - 带有百分比符号 (%) 的 THROW 会产生奇怪的错误消息

转载 作者:行者123 更新时间:2023-12-04 18:05:10 26 4
gpt4 key购买 nike

在 SSMS1 中执行以下 T-SQL 语句会给出一条错误消息,其中包含一个空格 2:

THROW 50000, 'abc%de', 0;

Msg 50000, Level 16, State 0, Line 1

但是,如果我通过加倍转义 % ,则会收到预期的错误消息:
THROW 50000, 'abc%%de', 0;

Msg 50000, Level 16, State 0, Line 1
abc%de

我还注意到,当 % 后跟空格时,它只是被跳过:
THROW 50000, 'abc% de', 0;

Msg 50000, Level 16, State 0, Line 1
abc de

出于某种原因,THROW 以一种特殊的方式解释了 %。
  • 有人知道为什么吗?
  • 还有其他“特殊”字符吗?
  • 这在任何地方都有记录吗?

  • 我在 MS SQL Server 2012 和 2014 下观察到了这种行为。我没有尝试过其他版本。

    1 我也试过 ADO.NET,结果相同。

    2 这在这里不是很明显,但我已经仔细检查过:错误消息确实不是空字符串,而是一个空格。

    最佳答案

    THROW 的文档说明:

    The message parameter does not accept printf style formatting



    https://msdn.microsoft.com/en-us/library/ee677615.aspx

    这应该可以解释为什么它无法打印文本。

    RAISERROR 文档 (msg_str) 中提供了有关 SQL Server 中 printf 样式格式的更多信息:

    https://msdn.microsoft.com/en-us/library/ms178592.aspx

    这将测试 0-255 之间的字符以检查它们是否会返回:
    DECLARE @errors TABLE(CharNumber INT, CharValue CHAR(1), ErrorText NVARCHAR(4000));
    DECLARE @i INT = 0;

    WHILE (@i <= 255)
    BEGIN
    DECLARE @c CHAR(1) = CHAR(@i);

    DECLARE @m VARCHAR(50) = 'abc%' + @c + 'de';
    BEGIN TRY
    THROW 50000, @m, 0;
    END TRY
    BEGIN CATCH
    INSERT INTO @errors
    SELECT @i, @c, ERROR_MESSAGE();
    END CATCH

    SET @i = @i + 1;
    END

    SELECT * FROM @errors WHERE ErrorText > '' ORDER BY CharNumber

    输出:
    CharNumber  CharValue   ErrorText
    32 abc de
    33 ! abc!de
    37 % abc%de
    46 . abc.de
    48 0 abcde
    110 n abc
    nde --<- This adds a new line.

    %n = 新行,但它没有删除 n,这有点好笑。

    关于sql-server - 带有百分比符号 (%) 的 THROW 会产生奇怪的错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28487296/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com