2016-03-31 10 views
2

Ich versuche, eine gespeicherte Prozedur für eine MSSQL 2008 R2-Datenbank zu schreiben. Die gespeicherte Prozedur sollte einige Werte vergleichen und einen Bit/Bool-Wert zurückgeben. Abhängig von einem Parameter (@PlatformCode) sollte die Prozedur die richtige Prüfung auswählen.Msg 102, Ebene 15, Status 1, Zeile 1 Falsche Syntax in der Nähe von '<'

Aber ich bekomme einen Fehler, in den Zeilen, wo ich versuche, mein Ergebnis in der Ausgabe var zu speichern.

CREATE PROCEDURE CheckVersion 
    @PlatformCode nvarchar(4), 
    @ClientVersion int, 
    @ConfigId int = 1, 
    @Response bit OUTPUT 

AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @version int 
    IF @PlatformCode = 'a' 
    BEGIN 
     SET @version = (SELECT aVersion FROM AppConfigTable WHERE ConfigID = @ConfigId) 
     SET @Response = (@version <= @ClientVersion) 
    END 
    IF @PlatformCode = 'i' 
    BEGIN 
     SET @version = (SELECT iVersion FROM AppConfigTable WHERE ConfigID = @ConfigId) 
     SET @Response = (@version <= @ClientVersion) 
    END 
END 
GO 

Gibt es vielleicht einen besseren Weg, um das Ergebnis zurückzugeben?

Antwort

2

Was Ihnen fehlt, ist die CASE-Anweisung

CREATE PROCEDURE CheckVersion 
    @PlatformCode nvarchar(4), 
    @ClientVersion int, 
    @ConfigId int = 1, 
    @Response bit OUTPUT 

AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @version int 
    IF @PlatformCode = 'a' 
    BEGIN 
     SET @version = (SELECT aVersion FROM AppConfigTable WHERE ConfigID = @ConfigId) 
     SET @Response = CASE WHEN (@version <= @ClientVersion) THEN 1 ELSE 0 END 
    END 
    IF @PlatformCode = 'i' 
    BEGIN 
     SET @version = (SELECT iVersion FROM AppConfigTable WHERE ConfigID = @ConfigId) 
     SET @Response = CASE WHEN (@version <= @ClientVersion) THEN 1 ELSE 0 END 
    END 
END 
GO 

noch besser Sie es wie folgt tun:

CREATE PROCEDURE CheckVersion 
    @PlatformCode nvarchar(4), 
    @ClientVersion int, 
    @ConfigId int = 1, 
    @Response bit OUTPUT 

AS 
BEGIN 
    SET NOCOUNT ON; 

    IF @PlatformCode = 'a' 
    BEGIN 
     SELECT @Response = CASE WHEN aVersion <= @ClientVersion THEN 1 ELSE 0 END FROM AppConfigTable WHERE ConfigID = @ConfigId   
    END 
    IF @PlatformCode = 'i' 
    BEGIN 
     SELECT @Response = CASE WHEN iVersion <= @ClientVersion THEN 1 ELSE 0 END FROM AppConfigTable WHERE ConfigID = @ConfigId   
    END 
END 
GO 
+0

Danke, der bessere Weg ist schön. Auf diese Weise gibt es nur eine Zeile nach dem 'IF', also kann ich 'BEGIN' und 'END' weglassen. Ist es in Ordnung, oder ist es sowohl mit dem "Beautifuller" -Code? – BHuelse

+0

Sie können es entweder lassen oder entfernen. Ich bevorzuge es, es zu verlassen, da es deutlich zeigt, wo die IF-Logik zutrifft. –

+0

@BHuelse können Sie bitte die Antwort als akzeptiert markieren, wenn Sie denken, dies ist die richtige Antwort. :) Prost –

Verwandte Themen