web-dev-qa-db-fra.com

Comment définir une variable à partir d'une requête SQL?

J'essaie de définir une variable à partir d'une requête SQL:

declare @ModelID uniqueidentifer

Select @ModelID = select modelid from models
where areaid = 'South Coast'

Évidemment, je ne le fais pas correctement car cela ne fonctionne pas. Quelqu'un peut-il suggérer une solution?

Merci!

272
Mr Cricket

Utilisation de SELECT:

SELECT @ModelID = m.modelid 
  FROM MODELS m
 WHERE m.areaid = 'South Coast'

Utiliser SET:

SET @ModelID = (SELECT m.modelid 
                  FROM MODELS m
                 WHERE m.areaid = 'South Coast')

Voir cette question pour la différence entre utiliser SELECT et SET dans TSQL .

Attention

Si cette instruction select retourne plusieurs valeurs (mauvais au début):

  • Lorsque vous utilisez SELECT, la variable reçoit la dernière valeur renvoyée (comme le dit womp), sans erreur ni avertissement (cela peut provoquer des bogues logiques)
  • Lorsque vous utilisez SET, une erreur se produira
459
OMG Ponies
SELECT @ModelID = modelid
FROM Models
WHERE areaid = 'South Coast'

Si votre instruction select renvoie plusieurs valeurs, la dernière valeur renvoyée est affectée à votre variable.

Pour plus d'informations sur l'utilisation de SELECT avec des variables: http://msdn.Microsoft.com/en-us/library/aa259186%28SQL.80%29.aspx

28
womp
declare @ModelID uniqueidentifer

--make sure to use brackets
set @ModelID = (select modelid from models
where areaid = 'South Coast')

select @ModelID
26
greg121

Je préfère simplement le définir à partir de l'instruction declare

DECLARE @ModelID uniqueidentifer = (SELECT modelid 
                                    FROM models
                                    WHERE areaid = 'South Coast')
11
Joshua Duxbury

Utilisez TOP 1 si la requête renvoie plusieurs lignes.

SELECT TOP 1 @ModelID = m.modelid 
  FROM MODELS m
 WHERE m.areaid = 'South Coast'
9
manu vijay
Select @ModelID =m.modelid 
From   MODELS m
Where  m.areaid = 'South Coast'

Dans ce cas, si vous avez deux résultats ou plus renvoyés, votre résultat est le dernier enregistrement. Sachez donc que si deux autres enregistrements peuvent être renvoyés, vous risquez de ne pas voir le résultat attendu.

3
Mohammad Farahani

Vous pouvez l'utiliser, mais souvenez-vous que votre requête donne 1 résultat, plusieurs résultats renverront l'exception.

declare @ModelID uniqueidentifer
Set @ModelID = (select Top(1) modelid from models where areaid = 'South Coast')

Autrement:

Select Top(1)@ModelID = modelid from models where areaid = 'South Coast'
1
Pranay_Sharma_Ind