52 votes

T-SQL, mise à jour de plus d'une variable dans une seule sélection

Est-il possible de mettre à jour plus d'une variable locale dans une seule sélection ?

Quelque chose comme :

set
    @variableOne = avg(someColumn),
    @variableTwo = avg(otherColumn)
    from tblTable

Il semble un peu inutile de faire deux opérations de sélection distinctes pour quelque chose d'aussi trivial que cette tâche :

set @variableOne = ( select avg(someColumn) from tblTable )
set @variableTwo = ( select avg(otherColumn) from tblTable )

111voto

Frederik Gheysels Points 36354

Quelque chose comme ça :

select @var1 = avg(someColumn), @var2 = avg(otherColumn) 
from theTable

13voto

David B Points 53123

Vous pouvez utiliser l'affectation SELECT pour affecter plusieurs variables. Ce code génère une seule ligne de constantes et affecte chacune d'entre elles à une variable.

SELECT
  @var1 = 1,
  @var2 = 'Zeus'

Vous pouvez même interroger des tableaux et effectuer des tâches de cette manière :

SELECT
  @var1 = c.Column1,
  @var2 = c.Column2,
FROM
  Customers c
WHERE c.CustomerID = @CustomerID

Attention : Ce code fonctionne comme une boucle while.

  • S'il y a plusieurs lignes, chaque ligne sera affectée aux variables et la dernière ligne sera celle qui reste. Si vous n'avez pas spécifié d'ordre, vous avez renoncé à contrôler quelle ligne sera la dernière.
  • S'il n'y a pas de lignes, les variables ne seront pas du tout affectées. Les variables ne seront pas définies comme nulles - elles resteront inchangées. Il s'agit d'un problème majeur si l'affectation est effectuée dans une boucle (ce qui aboutit généralement à une boucle infinie puisque les variables ne changent jamais).

Préférez l'utilisation de l'affectation SET à l'affectation SELECT. N'utilisez l'affectation SELECT que si vous envisagez les deux scénarios ci-dessus.

1voto

no_one Points 1403

Comment

SELECT  @variableOne = avg(someColumn),  @variableTwo = avg(otherColumn) from tblTable 

ça marche très bien pour moi.

-2voto

Cesar Murrieta Points 1
SELECT DISTINCT 
@Var1 = Column1,
@Var2 = Column2
FROM MyTable 
WHERE Columnx = @Parm1

1 votes

Ne vous contentez pas d'afficher un code, expliquez votre réponse. En outre, en quoi cela est-il différent de ce qu'Amy B a posté il y a 10 ans, avec beaucoup plus de détails ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X