web-dev-qa-db-fra.com

Comment définir plusieurs valeurs dans une instruction if else?

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?

17
mattias

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
35
Abdul Rasheed

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'
5
MatBailie

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
2
HoneyBadger

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
1
Alexei

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'
0
t-clausen.dk