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.