Tại sao% cấm char trong tin nhắn THWAY?


7

Câu hỏi đơn giản:

THROW 50000, 'Because of this ->%<- is this message invisible.', 1;
  • bạn không thể vượt qua các tham số% s,% d như trong RAISERROR
  • bạn phải sử dụng FORMATMESSAGE
  • nhưng dù sao cũng đã thất bại nếu% không được nhân đôi (hiển thị đúng)

Đã thử nghiệm trên Microsoft SQL Server 2012 (SP1) 11.0.3381.0 (X64), 11.0.3000.0 (X64)


Ví dụ thế giới thực:

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

@swasheck Thật sao? Tôi chỉ có "Msg 50000, Cấp 16, Bang 1, Dòng 1", không có tin nhắn.
DiGi

không lấy làm tiếc. tôi đã không đúng tôi đã nhìn vào hai thứ khác nhau: S
swasheck

Thật thú vị khi lưu ý rằng nếu bạn đặt một khoảng char(32)
trắng

Câu trả lời:


1

Có vẻ như họ đã để lại printfchức năng (hoặc ít nhất là một phần của nó) trong lệnh THWAY nhưng không bao gồm một cách để truyền tham số cho nó. Tôi đã thử từng ký tự được liệt kê trong BOL cho RAISEERROR càng nhiều "loại" càng tốt %(d, i, o, s, x, X, or u)và mỗi ký tự đều trả lại một khoảng trống. Bất kỳ ký tự nào khác sau% và bạn nhận lại một chuỗi hợp lệ. Tôi đoán là họ đang thay thế giá trị bằng một NULLđiều tất nhiên làm cho bất kỳ nối chuỗi nào trả về một NULLvà khi được in trông trống.

Thật không may, không có mã đằng sau nó (hoặc ít nhất là một Nhà phát triển MS) để xác nhận, không có cách nào để chắc chắn.


1
Không hoàn toàn - %nví dụ sẽ được coi là \n(thử nó). Tôi đang nhận được xác nhận từ Microsoft folks và sẽ đăng một lời giải thích kỹ lưỡng hơn khi tôi nhận được.
Aaron Bertrand

@AaronBertrand Bạn nói đúng. Tôi đã quay lại và kiểm tra và có một dòng trống cho az (trừ n) và 1-9. Tôi đang mong đợi để xem những gì bạn tìm hiểu.
Kenneth Fisher

Điều này thật đáng buồn. Họ đã cho chúng tôi làm việc Ngoại lệ (cuối cùng!) Nhưng ngay lập tức đã phá vỡ nó. Các tham số tin nhắn đã biến mất và chúng thậm chí còn quản lý để giữ một số mã liên quan đến tham số, chỉ để cho vui.
DiGi

0

Tôi đồng ý với Kenneth Fisher ... giá trị được thay thế bằng NULL...

DECLARE @ProcParam VARCHAR(30) = 'Hehe%x!';
DECLARE @Message VARCHAR(500) = FORMATMESSAGE('Procedure input ' + @ProcParam + ' is wrong');
THROW 50000, @Message, 1;

Msg 50000, Level 16, State 1, Line 3
Procedure input Hehe(null)! is wrong

Nó không phải là sự thật. Bạn chuyển% s làm tham số FORMATMESSAGE (vì bạn tham gia chuỗi bằng dấu cộng) nhưng bạn không chỉ định bất kỳ tham số thực nào để thay thế. Bạn đang gọi: FORMATMESSAGE ('Giá trị lỗi:% s', NULL, NULL, ... ...)
DiGi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.