Wie setze ich eine Variable aus einer SQL-Abfrage?

323

Ich versuche, eine Variable aus einer SQL-Abfrage festzulegen:

declare @ModelID uniqueidentifer

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

Offensichtlich mache ich das nicht richtig, da es nicht funktioniert. Kann jemand eine Lösung vorschlagen?

Vielen Dank!

Herr Cricket
quelle
2
Es ist eine eindeutige Kennung. Kein eindeutiger Identifikator.
DxTx

Antworten:

517

Verwenden von SELECT:

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

Verwenden von SET:

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

In dieser Frage finden Sie den Unterschied zwischen der Verwendung von SELECT und SET in TSQL .

Warnung

Wenn diese select-Anweisung mehrere Werte zurückgibt (zunächst schlecht):

  • Bei Verwendung SELECTwird der Variablen der letzte zurückgegebene Wert zugewiesen (wie gesagt), ohne Fehler oder Warnung (dies kann zu logischen Fehlern führen).
  • Bei der Verwendung SETtritt ein Fehler auf
OMG Ponys
quelle
3
Wenn diese select-Anweisung mehrere Werte zurückgibt: Im ersten Fall wird der Variablen der letzte zurückgegebene Wert zugewiesen (wie von womp gesagt), ohne Fehler oder Warnung (dies kann zu logischen Fehlern führen). Im zweiten Fall tritt ein Fehler auf.
Francis Niu
3
Übrigens benötigt der Fall mit SET ein Paar Klammern: SET @ModelID = (SELECT ...)
Francis Niu
2
Ich würde TOP 1 mit select verwenden, um nur 1 Ergebnis zu erzielen, z. B. SET @ModelID = (SELECT TOP 1 m.modelid FROM MODELS m WHERE m.areaid = 'South Coast')
TPAKTOPA
Wenn bei Verwendung von set mehrere Werte zurückgegeben werden, wie wird dann mit der Ausnahmebehandlung umgegangen?
Lerner
Manchmal möchten Sie einen Fehler, wenn ein unerwartetes doppeltes Ergebnis vorliegt, anstatt ein unerwartetes Ergebnis stillschweigend zu verwenden.
Denise Skidmore
37
SELECT @ModelID = modelid
FROM Models
WHERE areaid = 'South Coast'

Wenn Ihre select-Anweisung mehrere Werte zurückgibt, wird Ihrer Variablen der letzte zurückgegebene Wert zugewiesen.

Referenz zur Verwendung von SELECT mit Variablen: http://msdn.microsoft.com/en-us/library/aa259186%28SQL.80%29.aspx

womp
quelle
28
declare @ModelID uniqueidentifer

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

select @ModelID
greg121
quelle
Diese Frage hat eine Antwort, die nicht erneut beantwortet werden musste. Ich kann nicht einmal sehen, was zwischen Ihrer und der Antwort von Ponys unterschiedlich ist.
Joshua Duxbury
5
@ JoshuaDuxbury es bietet eine funktionierende Version zum Einfügen von
Kopien
16

Ich ziehe es vor, es einfach aus der Deklarationsanweisung zu setzen

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

Verwenden Sie TOP 1diese Option, wenn die Abfrage mehrere Zeilen zurückgibt.

SELECT TOP 1 @ModelID = m.modelid 
  FROM MODELS m
 WHERE m.areaid = 'South Coast'
manu vijay
quelle
Es wird keinen Fehler in SQL verursachen. Es wird der letzte Datensatz ausgewählt (obwohl dies zu einem Fehler in einer Anwendung führen kann, wenn Sie diesen Wert verwenden und er falsch ist)
d219
9

Sie können dies verwenden, aber denken Sie daran, dass Ihre Abfrage 1 Ergebnis liefert. Mehrere Ergebnisse lösen die Ausnahme aus.

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

Ein anderer Weg:

Select Top(1)@ModelID = modelid from models where areaid = 'South Coast'
Pranay_Sharma_Ind
quelle
4
Select @ModelID =m.modelid 
From   MODELS m
Where  m.areaid = 'South Coast'

In diesem Fall ist Ihr Ergebnis der letzte Datensatz, wenn Sie zwei oder mehr Ergebnisse zurückgegeben haben. Beachten Sie dies, wenn möglicherweise zwei weitere Datensätze zurückgegeben werden, da das erwartete Ergebnis möglicherweise nicht angezeigt wird.

Mohammad Farahani
quelle
4

Es gibt drei Ansätze:

  1. ERKLÄREN
  2. SET - Von Microsoft empfohlener Ansatz
  3. WÄHLEN

Die folgende Abfrage beschreibt die Vor- und Nachteile der einzelnen:

-- 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
Venkataraman R.
quelle
1

Um Variablen mithilfe eines SQL zuzuweisen, wählen Sie die unten gezeigte bewährte Methode

->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;

Wenn Sie mehr als eine Variable in einer einzelnen Zeile zuweisen müssen, können Sie dieselbe SELECT INTO verwenden

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

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

--HAPPY CODING-- 
Venkzz_venki
quelle
"Best Practice" - Quelle?
Rodney Ellis
Wenn Sie mehr als eine Spalte zur Auswahl aus einer Tabelle haben, können Sie diese einfach mit einer einzelnen SELECT INTO-Anweisung zuweisen, anstatt den Code zu wiederholen !!
Venkzz_venki