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!



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

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,


29
declare @ModelID uniqueidentifer

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

select @ModelID

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

10

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

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

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'

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.


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

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

„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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.