Come impostare la variabile da una query SQL?


324

Sto cercando di impostare una variabile da una query SQL:

declare @ModelID uniqueidentifer

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

Ovviamente non lo sto facendo bene perché non funziona. Qualcuno può suggerire una soluzione?

Grazie!



2
È IDidentificatore univoco. Non uniqueidentifer.
DxTx,

Risposte:


519

Utilizzando SELECT:

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

Utilizzando SET:

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

Vedi questa domanda per la differenza tra l'utilizzo di SELECT e SET in TSQL .

avvertimento

Se questa istruzione select restituisce più valori (per cominciare non male):

  • Durante l'utilizzo SELECT, alla variabile viene assegnato l'ultimo valore restituito (come ha detto Womp), senza alcun errore o avviso (ciò può causare errori logici)
  • Durante l'utilizzo SET, si verificherà un errore

3
Se questa istruzione select restituisce più valori: nel primo caso, alla variabile viene assegnato l'ultimo valore che viene restituito (come ha detto womp), senza alcun errore o avviso (ciò può causare errori logici); nel secondo caso, si verificherà un errore.
Francis Niu,

3
A proposito, il caso che utilizza SET richiede una coppia di parentesi: SET @ModelID = (SELEZIONA ...)
Francis Niu,

2
Vorrei utilizzare TOP 1 con select, per ottenere solo 1 risultato, ad esempio SET @ModelID = (SELEZIONA TOP 1 m.modelid DA MODELLI m DOVE m.areaid = 'Costa meridionale')
TPAKTOPA

Nel caso in cui si usi set quando vengono restituiti più valori, come gestirlo usando la gestione delle eccezioni?
discente

A volte vuoi un errore se c'è un risultato duplicato inaspettato piuttosto che usare silenziosamente un risultato imprevisto.
Denise Skidmore,


29
declare @ModelID uniqueidentifer

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

select @ModelID

Questa domanda pronta ha una risposta a cui non è necessario rispondere di nuovo, non riesco nemmeno a vedere cosa c'è di diverso tra la tua e la Pony?
Joshua Duxbury,

5
@JoshuaDuxbury fornisce una versione di copia incolla funzionante
greg121

17

Preferisco solo impostarlo dalla dichiarazione di dichiarazione

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

10

Utilizzare TOP 1se la query restituisce più righe.

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

In realtà non causerà un errore in SQL, selezionerà l'ultimo record (anche se potrebbe causare un errore risultante in un'applicazione se si utilizza questo valore ed è errato)
d219

9

Puoi usarlo, ma ricorda che la tua query dà 1 risultato, più risultati genereranno l'eccezione.

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

Un altro modo:

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

4
Select @ModelID =m.modelid 
From   MODELS m
Where  m.areaid = 'South Coast'

In questo caso, se hai restituito due o più risultati, il risultato è l'ultimo record. Quindi tieni presente questo se potresti avere altri due record restituiti in quanto potresti non vedere il risultato previsto.


4

Esistono tre approcci:

  1. DICHIARARE
  2. SET - Approccio consigliato da Microsoft
  3. SELEZIONARE

Di seguito la query descrive i vantaggi e gli svantaggi di ciascuno:

-- First way, 
DECLARE @test int = (SELECT 1)
       , @test2 int = (SELECT a from (values (1),(2)) t(a)) -- throws error

-- advantage: declare and set in the same place
-- Disadvantage: can be used only during declaration. cannot be used later

-- Second way
DECLARE @test int  
       , @test2 int 

SET @test = (select 1)
SET @test2 = (SELECT a from (values (1),(2)) t(a)) -- throws error

-- Advantage: ANSI standard. 
-- Disadvantage: cannot set more than one variable at a time

-- Third way
DECLARE @test int, @test2 int 
SELECT @test = (select 1)
      ,@test2 = (SELECT a from (values (1),(2)) t(a)) -- throws error

-- Advantage: Can set more than one variable at a time
-- Disadvantage: Not ANSI standard

1

Per ASSEGNARE le variabili usando un SQL selezionare la best practice è come mostrato di seguito

->DECLARE co_id INT ;
->DECLARE sname VARCHAR(10) ;

->SELECT course_id INTO co_id FROM course_details ;
->SELECT student_name INTO sname FROM course_details;

SE devi assegnare più di una variabile in una sola riga puoi usare lo stesso SELECT INTO

->DECLARE val1 int;
->DECLARE val2 int;

->SELECT student__id,student_name INTO val1,val2 FROM student_details;

--HAPPY CODING-- 

"best practice" - fonte?
Rodney Ellis,

Se hai più di una colonna da selezionare da una tabella, puoi assegnarla facilmente usando una singola istruzione SELECT INTO invece di ripetere il codice !!
Venkzz_venki,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.