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!



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

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


28
declare @ModelID uniqueidentifer

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

select @ModelID

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')

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'

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'

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.


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

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

"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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.