Die Dokumentationen für FORMATMELDUNG say "Für weitere Informationen über die in Fehlermeldungen zulässigen Platzhalter und den Bearbeitungsprozess siehe RAISERROR (Transact-SQL) ." Dies scheint wirklich zu bedeuten, dass RAISERROR auf die gleiche Weise funktionieren sollte wie FORMATMESSAGE.
Da Sie CONVERT (aber nicht CAST) in den Parametern von FORMATMESSAGE verwenden können, könnten Sie, wenn die Implikation wahr wäre, CONVERT in den Parametern von RAISERROR verwenden, was einen netten und eleganten Einzeiler ermöglichen würde.
Aber SQL Server funktioniert nicht (so wie Sie es erwarten). Aber zumindest kann man es etwas einfacher machen: Sie müssen nur eine Variable deklarieren, nicht zwei:
DECLARE @ErrorMessage NVARCHAR(1000);
SET @ErrorMessage= FORMATMESSAGE('SPName: InsertUpdateLiquidityDateRule: Start Date: %s cannot be greater than End Date %s',
CONVERT (VARCHAR(30), @EffectiveStartDate, 23),
CONVERT (VARCHAR(30), @EffectiveEndDate, 23)
);
RAISERROR (@ErrorMessage, 11, 1);
(SQL Server 2016 SP2-CU12)
Erland Sommarskog (SQL Server MVP seit 2001) fasst es treffend zusammen aquí : "Ich habe das Gefühl, dass SQL Server absichtlich so verwirrend wie möglich sein soll". Und "wenn Sie irgendwann einmal [sic] zur Tür und schrie: "Orakel, komm zurück, alles ist vergeben, ich kann es dir nicht verdenken".