Warum ist% verbotenes Zeichen in der THROW-Nachricht?

7

Einfache Frage:

THROW 50000, 'Because of this ->%<- is this message invisible.', 1;
  • Sie können die Parameter% s,% d nicht wie in RAISERROR übergeben
  • Sie müssen FORMATMESSAGE verwenden
  • aber THROW ist trotzdem fehlgeschlagen, wenn% nicht verdoppelt wird (korrekte Anzeige)

Getestet unter Microsoft SQL Server 2012 (SP1) 11.0.3381.0 (X64), 11.0.3000.0 (X64)


Beispiel aus der realen Welt:

DECLARE @ProcParam VARCHAR(30) = 'Hehe%x!';
DECLARE @Message VARCHAR(500) = FORMATMESSAGE('Procedure input %s is wrong', @ProcParam);
PRINT 'Message: ' + @Message;
THROW 50000, @Message, 1;
DiGi
quelle
@swasheck Wirklich? Ich habe nur "Nachricht 50000, Ebene 16, Status 1, Zeile 1", ohne Nachricht.
DiGi
Nee. Es tut uns leid. Ich war falsch. Ich habe zwei verschiedene Dinge betrachtet: S
Swasheck
Es ist interessant zu bemerken, dass, wenn Sie ein Leerzeichen char(32)nach dem% setzen, die Nachricht (ohne%)
angezeigt wird

Antworten:

1

Es scheint, dass sie die printfFunktionalität (oder zumindest einen Teil davon) im Befehl THROW belassen haben, aber keine Möglichkeit zum Übergeben eines Parameters an ihn enthalten haben. Ich habe jedes der in BOL für RAISEERROR aufgelisteten Zeichen als mögliche "Typen" ausprobiert%(d, i, o, s, x, X, or u) und jedes von ihnen hat ein Leerzeichen zurückgegeben. Jedes andere Zeichen nach dem% und Sie erhalten eine gültige Zeichenfolge zurück. Ich vermute, dass sie den Wert durch einen ersetzen, NULLwas natürlich dazu führt, dass jede Zeichenfolgenverkettung a zurückgibt NULLund beim Drucken leer aussieht.

Leider gibt es ohne den Code dahinter (oder zumindest einen MS-Entwickler) zur Bestätigung keine Möglichkeit, sicher zu sein.

Kenneth Fisher
quelle
1
Nicht ganz - %nzum Beispiel wird behandelt als \n(probieren Sie es aus). Ich erhalte eine Bestätigung von Microsoft-Leuten und werde eine ausführlichere Erklärung veröffentlichen, wenn ich eine bekomme.
Aaron Bertrand
@ AaronBertrand Du hast recht. Ich ging zurück und überprüfte und bekam eine leere Zeile für az (außer n) und 1-9. Ich freue mich darauf zu sehen, was Sie herausfinden.
Kenneth Fisher
Das ist so traurig. Sie gaben uns funktionierende Ausnahmen (endlich!), Aber sie haben es sofort gebrochen. Nachrichtenparameter sind weg und es ist ihnen sogar gelungen, nur zum Spaß einen parameterbezogenen Code beizubehalten.
DiGi
0

Ich stimme Kenneth Fisher zu ... der Wert wird ersetzt durch 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
Richard101
quelle
Es ist nicht wahr. Sie übergeben% s als FORMATMESSAGE-Parameter (weil Sie Zeichenfolgen mit Plus verbinden), haben jedoch keine echten Parameter zum Ersetzen angegeben. Sie rufen an: FORMATMESSAGE ('Fehlerwert:% s', NULL, NULL, ... ...)
DiGi