J'essaie de définir plusieurs valeurs dans l'instruction if else ci-dessous. Si je définis une valeur, cela fonctionne, mais si je définis deux valeurs, cela ne fonctionne pas:
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'
Message d'erreur: "Msg 156, niveau 15, état 1, ligne 9
Syntaxe incorrecte près du mot clé 'ELSE'. "
Cependant, il semble possible d'avoir plusieurs variables SET après l'autre; ce code fonctionne:
IF ((SELECT COUNT(*) FROM table WHERE table.Date > '2016-03-20') > 10)
SET @test1 = 'test1'
ELSE
SET @test1 = 'testelse'
SET @test2 = 'testelse'
Comment puis-je faire cela correctement?
Si vous avez plusieurs instructions dans une condition if, vous devez utiliser le bloc BEGIN ... END
pour les encapsuler.
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
Utilisez BEGIN
et END
pour marquer un bloc de code comportant plusieurs instructions, comme si vous utilisiez {
et }
dans d'autres langues, dans lesquelles vous pouvez placer vos multiples instructions SET
...
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
Ou bien, utilisez SELECT
pour attribuer des valeurs à vos variables, ce qui vous permet d’attribuer les deux en une seule instruction et d’éviter ainsi d’exiger l’utilisation de BEGIN
et END
.
IF ((SELECT COUNT(*) FROM table WHERE table.Date > '2016-03-20') > 10)
SELECT
@test1 = 'test1',
@test2 = 'test2'
ELSE
SELECT
@test1 = 'testelse',
@test2 = 'testelse'
Si vous avez plusieurs déclarations après la IF
, vous devez utiliser begin
et end
(semblable aux accolades dans c #, par exemple).
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
Le comportement est logique puisque votre premier essai sera divisé comme suit:
IF ((SELECT COUNT(*) FROM table WHERE table.Date > '2016-03-20') > 10)
SET @test1 = 'test1'
SET @test2 = 'test2'
ELSE
SET @test1 = 'testelse'
et ELSE
échouera car il n'appartient à aucune instruction IF.
Pensez à faire comme ça:
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
La seconde expression de votre question aura toujours pour résultat execute @ test2 = 'testelse' car ELSE se termine juste après la première expression après l'autre:
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'
Si vous avez plusieurs expressions dans l'IF, vous pouvez toujours les regrouper à l'aide de BEGIN/END.
Mais dans votre cas, le moyen le plus simple serait le suivant:
IF (SELECT COUNT(*) FROM table WHERE table.Date > '2016-03-20') > 10
SELECT @test1 = 'test1', @test2 = 'test2'
ELSE
SELECT @test1 = 'testelse', @test2 = 'testelse'