2009-01-22 10 views
33

Est-il possible de mettre à jour plusieurs variables locales dans une seule sélection?T-SQL, mise à jour de plusieurs variables 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) 

Répondre

78

Quelque chose comme ceci:

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

Parfait, merci! – jandersson

1

qu'en est-il pour

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

ça marche très bien pour moi.

9

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

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

Vous pouvez même les tables requête et faire cession de cette façon:

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 à l'intérieur. Si vous n'avez pas spécifié de commande, vous avez abandonné le contrôle sur la rangée qui sera la dernière rangée.
  • S'il n'y a pas de lignes, les variables ne seront pas affectées du tout. Les variables ne seront pas définies sur null - elles resteront inchangées. C'est un problème clé si l'affectation est effectuée dans une boucle (ce qui entraîne généralement une boucle infinie car les variables ne changent jamais).

Préférez utiliser l'affectation SET plutôt que l'affectation SELECT. N'utilisez l'affectation SELECT qu'en considérant les deux scénarios ci-dessus.

Questions connexes