Jak ustawić zmienną z zapytania SQL?

324

Próbuję ustawić zmienną z zapytania SQL:

declare @ModelID uniqueidentifer

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

Oczywiście nie robię tego dobrze, ponieważ to nie działa. Czy ktoś może zaproponować rozwiązanie?

Dzięki!

Mr Cricket
źródło
2
To unikalny identyfikator. Nie niepowtarzalny identyfikator.
DxTx

Odpowiedzi:

518

Używając WYBIERZ:

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

Za pomocą SET:

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

Zobacz to pytanie, aby zobaczyć różnicę między użyciem SELECT i SET w TSQL .

Ostrzeżenie

Jeśli ta instrukcja select zwraca wiele wartości (złe na początek):

  • Podczas używania SELECTdo zmiennej przypisywana jest ostatnia zwracana wartość (jak powiedział womp), bez żadnego błędu lub ostrzeżenia (może to powodować błędy logiczne)
  • Podczas używania SETwystąpi błąd
Kucyki OMG
źródło
3
Jeśli ta instrukcja select zwraca wiele wartości: w pierwszym przypadku zmiennej jest przypisywana ostatnia zwracana wartość (jak powiedział womp), bez żadnego błędu lub ostrzeżenia (może to powodować błędy logiczne); w drugim przypadku wystąpi błąd.
Francis Niu,
3
BTW, sprawa wykorzystująca SET potrzebuje pary nawiasów: SET @ModelID = (WYBIERZ ...)
Francis Niu,
2
Chciałbym użyć TOP 1 z select, aby uzyskać tylko 1 wynik, np. SET @ModelID = (WYBIERZ TOP 1 m.modelid Z MODELI m GDZIE m.areaid = 'South Coast')
TPAKTOPA
W przypadku użycia zestawu, gdy zwracanych jest wiele wartości, to jak go obsłużyć za pomocą obsługi wyjątków?
uczeń
Czasami potrzebujesz błędu, jeśli pojawia się nieoczekiwany duplikat, zamiast cicho używać nieoczekiwanego wyniku.
Denise Skidmore,
37
SELECT @ModelID = modelid
FROM Models
WHERE areaid = 'South Coast'

Jeśli instrukcja select zwraca wiele wartości, do zmiennej przypisywana jest ostatnia zwracana wartość.

Aby uzyskać informacje na temat używania instrukcji SELECT ze zmiennymi: http://msdn.microsoft.com/en-us/library/aa259186%28SQL.80%29.aspx

womp
źródło
29
declare @ModelID uniqueidentifer

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

select @ModelID
greg121
źródło
To gotowe pytanie ma odpowiedź, na którą nie trzeba było już odpowiadać. Nie widzę nawet, co różni się między odpowiedzią na twoje a kucyki?
Joshua Duxbury,
5
@JoshuaDuxbury zapewnia wersję wklejania kopii roboczej
greg121,
17

Wolę po prostu ustawić go z deklaracji

DECLARE @ModelID uniqueidentifer = (SELECT modelid 
                                    FROM models
                                    WHERE areaid = 'South Coast')
Joshua Duxbury
źródło
10

Użyj, TOP 1jeśli zapytanie zwraca wiele wierszy.

SELECT TOP 1 @ModelID = m.modelid 
  FROM MODELS m
 WHERE m.areaid = 'South Coast'
Manu Vijay
źródło
W rzeczywistości nie spowoduje błędu w SQL, wybierze ostatni rekord (chociaż może powodować wynikowy błąd w aplikacji, jeśli używasz tej wartości i jest ona niepoprawna)
d219 30.04.18
9

Możesz tego użyć, ale pamiętaj, że zapytanie daje 1 wynik, wiele wyników wyrzuci wyjątek.

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

Inny sposób:

Select Top(1)@ModelID = modelid from models where areaid = 'South Coast'
Pranay_Sharma_Ind
źródło
4
Select @ModelID =m.modelid 
From   MODELS m
Where  m.areaid = 'South Coast'

W takim przypadku, jeśli zwrócono dwa lub więcej wyników, wynik jest ostatnim rekordem. Pamiętaj o tym, jeśli możesz zwrócić jeszcze dwa rekordy, ponieważ możesz nie zobaczyć oczekiwanego wyniku.

Mohammad Farahani
źródło
4

Istnieją trzy podejścia:

  1. OGŁOSIĆ
  2. ZESTAW - podejście zalecane przez Microsoft
  3. WYBIERZ

Poniżej kwerendy szczegółowo zalety i wady każdego z nich:

-- 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
źródło
1

Aby przypisać zmienne za pomocą SQL, wybierz najlepszą praktykę, jak pokazano poniżej

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

JEŚLI musisz przypisać więcej niż jedną zmienną w jednym wierszu, możesz użyć tego samego WYBIERZ W

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

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

--HAPPY CODING-- 
Venkzz_venki
źródło
„najlepsza praktyka” - źródło?
Rodney Ellis
JEŚLI masz więcej niż jedną kolumnę do wyboru z tabeli, możesz łatwo przypisać ją za pomocą pojedynczej instrukcji SELECT INTO zamiast powtarzania kodu !!
Venkzz_venki