36 Stimmen

Wie wird die DateTime-Variable in der RAISERROR-Methode gedruckt?

Meine Stored Procedure akzeptiert zwei Parameter @EffectiveStartDate DATETIME
@EffectiveEndDate DATETIME

Ich habe den Validierungscode wie folgt geschrieben:

IF(@EffectiveStartDate > @EffectiveEndDate)
        BEGIN
            RAISERROR ('SPName: InsertUpdateLiquidityDateRule:  Start Date: %s cannot  be greater than End Date %s',11,1,CAST(@EffectiveStartDate AS varchar(30)),CAST(@EffectiveEndDate AS varchar(30)));
            RETURN -1
        END 

Darf ich erfahren, was ich hier falsch mache?

Beim Kompilieren meines SProc wurde die Meldung 'Incorrect syntax near CAST()' ausgegeben.

37voto

Alex Aza Punkte 73463

Der angegebene Wert muss eine Konstante oder eine Variable sein. Sie können keinen Funktionsnamen als Parameterwert angeben. (aus MSDN Ausführen von gespeicherten Prozeduren ).

Sie müssen etwa so vorgehen:

declare @EffectiveStartDateText varchar(30)
set @EffectiveStartDateText = cast(@EffectiveStartDate as varchar)

declare @EffectiveEndDateText varchar(30)
set @EffectiveEndDateText = cast(@EffectiveEndDate as varchar)

RAISERROR (
    'SPName: InsertUpdateLiquidityDateRule:  Start Date: %s cannot  be greater than End Date %s',
    11,
    1,
    @EffectiveStartDateText,
    @EffectiveEndDateText);

4voto

Reversed Engineer Punkte 1038

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".

0voto

Chris Singleton Punkte 135

Um Ihnen zu helfen, hier ein weiteres Beispiel. Ich füge dies in die BEGIN CATCH-Anweisung nach meinem BEGIN TRY ein.

Hinweis: Dies ist der Verwendung einer if-Anweisung sehr ähnlich.

BEGIN TRY
--Do something.
END TRY 

BEGIN CATCH
    --Else on error do this.
    PRINT 'Problem found!!! ' 

    -- Whoops, there was an error
    -- Raise an error with the details of the exception
    DECLARE @ErrMsg nvarchar(4000), 
            @ErrSeverity int, 
            @ErrLineNum int

    SELECT @ErrMsg = ERROR_MESSAGE(), 
           @ErrSeverity = ERROR_SEVERITY(), 
           @ErrLineNum = ERROR_LINE()

    RAISERROR(@ErrMsg, @ErrSeverity, 1, @ErrLineNum)

END CATCH

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X