web-dev-qa-db-fra.com

T-SQL, mise à jour de plusieurs variables en une seule sélection

Est-il possible de mettre à jour plus d'une variable locale en 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 )
44
jandersson

Quelque chose comme ça:

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

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

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

Vous pouvez même interroger des tables et effectuer des affectations 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. Si vous n'avez pas spécifié de commande, vous avez abandonné le contrôle sur la ligne qui sera la dernière ligne.
  • 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. Il s'agit d'un problème clé si l'affectation est effectuée dans une boucle (résultant généralement en une boucle infinie car les variables ne changent jamais).

Préférez utiliser l'affectation SET plutôt que l'affectation SELECT. Utilisez uniquement l'affectation SELECT lorsque vous envisagez les deux scénarios ci-dessus.

13
Amy B

que diriez-vous

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

cela fonctionne très bien pour moi.

1
no_one