Ich versuche, mehr als einen Wert in der if-Anweisung anzugeben, wenn ich einen Wert setze, funktioniert es, aber wenn ich zwei Werte setze, funktioniert es nicht:
DECLARE @test1 varchar(60);
DECLARE @test2 varchar(60);
IF ((SELECT COUNT(*) FROM table WHERE table.Date > '2016-03-20') > 10)
SET @test1 = 'test1'
SET @test2 = 'test2'
ELSE
SET @test1 = 'testelse'
SET @test2 = 'testelse'
Fehlermeldung: "Nachricht 156, Ebene 15, Status 1, Zeile 9
Falsche Syntax in der Nähe des Schlüsselworts "ELSE". "
Es scheint jedoch möglich zu sein, mehrere SET-Variablen hinter dem else zu haben; Dieser Code funktioniert:
IF ((SELECT COUNT(*) FROM table WHERE table.Date > '2016-03-20') > 10)
SET @test1 = 'test1'
ELSE
SET @test1 = 'testelse'
SET @test2 = 'testelse'
Wie kann ich das richtig machen?
Wenn Sie mehr als eine Anweisung in einer if-Bedingung haben, müssen Sie den BEGIN ... END
-Block verwenden, um sie einzukapseln.
IF ((SELECT COUNT(*) FROM table WHERE table.Date > '2016-03-20') > 10)
BEGIN
SET @test1 = 'test1'
SET @test2 = 'test2'
END
ELSE
BEGIN
SET @test1 = 'testelse'
SET @test2 = 'testelse'
END
Verwenden Sie BEGIN
und END
, um einen aus mehreren Anweisungen bestehenden Codeblock zu markieren, ähnlich wie bei Verwendung von {
und }
in anderen Sprachen, in denen Sie mehrere SET
-Anweisungen platzieren können.
IF ((SELECT COUNT(*) FROM table WHERE table.Date > '2016-03-20') > 10)
BEGIN
SET @test1 = 'test1'
SET @test2 = 'test2'
END
ELSE
BEGIN
SET @test1 = 'testelse'
SET @test2 = 'testelse'
END
Oder verwenden Sie SELECT
, um Ihren Variablen Werte zuzuweisen, sodass beide in einer einzelnen Anweisung zugewiesen werden können und vermeiden Sie die Verwendung von BEGIN
und END
.
IF ((SELECT COUNT(*) FROM table WHERE table.Date > '2016-03-20') > 10)
SELECT
@test1 = 'test1',
@test2 = 'test2'
ELSE
SELECT
@test1 = 'testelse',
@test2 = 'testelse'
Wenn Sie nach IF
mehrere Anweisungen haben, müssen Sie begin
und end
verwenden (ähnlich wie beispielsweise Auszeichnungen in c #).
IF ((SELECT COUNT(*) FROM table WHERE table.Date > '2016-03-20') > 10)
BEGIN
SET @test1 = 'test1'
SET @test2 = 'test2'
END
ELSE
BEGIN
SET @test1 = 'testelse'
SET @test2 = 'testelse'
END
Das Verhalten ist sinnvoll, da Ihre erste Prüfung folgendermaßen aufgeteilt wird:
IF ((SELECT COUNT(*) FROM table WHERE table.Date > '2016-03-20') > 10)
SET @test1 = 'test1'
SET @test2 = 'test2'
ELSE
SET @test1 = 'testelse'
und ELSE
schlägt fehl, da sie keiner IF-Anweisung angehört.
Betrachten Sie so:
IF ((SELECT COUNT(*) FROM table WHERE table.Date > '2016-03-20') > 10)
BEGIN
SET @test1 = 'test1'
SET @test2 = 'test2'
END
ELSE
BEGIN
SET @test1 = 'testelse'
SET @test2 = 'testelse'
END
Der zweite Ausdruck in Ihrer Frage führt immer zum Ausführen von @ test2 = 'testelse' , da die ELSE direkt nach dem ersten Ausdruck nach dem else endet
IF ((SELECT COUNT(*) FROM table WHERE table.Date > '2016-03-20') > 10)
SET @test1 = 'test1'
ELSE
SET @test1 = 'testelse'
-- IF is done evaluating here
SET @test2 = 'testelse'
Wenn Sie mehrere Ausdrücke in der IF haben, können Sie die Ausdrücke immer mit BEGIN/END gruppieren.
In Ihrem Fall wäre dies jedoch der einfachste Weg:
IF (SELECT COUNT(*) FROM table WHERE table.Date > '2016-03-20') > 10
SELECT @test1 = 'test1', @test2 = 'test2'
ELSE
SELECT @test1 = 'testelse', @test2 = 'testelse'