Як встановити змінну із запиту SQL?


324

Я намагаюся встановити змінну із запиту SQL:

declare @ModelID uniqueidentifer

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

Очевидно, що я не роблю це правильно, як це не працює. Чи може хтось запропонувати рішення?

Дякую!



2
Це унікальний ідентифікатор. Не унікальнийідентифікатор.
DxTx

Відповіді:


518

Використання SELECT:

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

Використання SET:

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

Дивіться це питання щодо різниці між використанням SELECT та SET у TSQL .

Увага

Якщо цей оператор select повертає кілька значень (погано для початку):

  • При використанні SELECTзмінній присвоюється останнє значення, яке повертається (як сказано утробі), без помилок або попередження (це може спричинити помилки логіки)
  • Під час використання SETбуде статися помилка

3
Якщо цей оператор select повертає декілька значень: у першому випадку змінній присвоюється останнє значення, яке повертається (як сказано утробі), без будь-яких помилок або попередження (це може спричинити логічні помилки); у другому випадку відбудеться помилка.
Френсіс Ніу

3
До речі, для використання випадку SET потрібна пара дужок: SET @ModelID = (SELECT ...)
Френсіс Ніу

2
Я б використовував TOP 1 з виділенням, щоб мати лише 1 результат, наприклад SET @ModelID = (ВИБІР ТОП 1 m.modelid ВІД МОДЕЛЬ m, де m.areaid = 'Південне узбережжя')
TPAKTOPA

У разі використання набору, коли повертається декілька значень, то як обробити його, використовуючи обробку виключень?
учень

Іноді ви хочете помилку, якщо є несподіваний дублікат результату, а не тихо використання несподіваного результату.
Деніз Скідмор

37
SELECT @ModelID = modelid
FROM Models
WHERE areaid = 'South Coast'

Якщо ваш оператор select повертає кілька значень, вашій змінній присвоюється останнє значення, яке повертається.

Для довідок щодо використання SELECT зі змінними: http://msdn.microsoft.com/en-us/library/aa259186%28SQL.80%29.aspx


29
declare @ModelID uniqueidentifer

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

select @ModelID

На це питання всі готові мають відповідь, на яку не потрібно було відповідати знову, я навіть не можу побачити, що відрізняється між вашою та Поні?
Джошуа Дуксбері

5
@JoshuaDuxbury він пропонує версію вставки для робочої копії
greg121,

17

Я вважаю за краще просто встановити його з заяви заяви

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

10

Використовувати, TOP 1якщо запит повертає кілька рядків.

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

Він фактично не спричинить помилку в SQL, він вибере останню запис (хоча це може спричинити помилку в програмі, якщо ви використовуєте це значення, і воно неправильне)
d219

9

Ви можете використовувати це, але пам’ятайте, що ваш запит дає 1 результат, виняток становлять кілька результатів.

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

Інший спосіб:

Select Top(1)@ModelID = modelid from models where areaid = 'South Coast'

4
Select @ModelID =m.modelid 
From   MODELS m
Where  m.areaid = 'South Coast'

У цьому випадку, якщо у вас повернуто два чи більше результатів, ваш результат - це останній запис. Тож пам’ятайте про це, якщо у вас можуть бути повернуті ще дві записи, оскільки ви не можете побачити очікуваний результат.


4

Існує три підходи:

  1. ДЕКЛАРАЦІЯ
  2. SET - Рекомендований підхід від Microsoft
  3. ВИБІРИ

Нижче запит детально описує переваги та недоліки кожного:

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

Для ASSIGN змінних за допомогою SQL виберіть найкращу практику, як показано нижче

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

Якщо вам потрібно призначити більше однієї змінної в одному рядку, ви можете використовувати цю саму SELECT INTO

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

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

--HAPPY CODING-- 

"краща практика" - джерело?
Родні Елліс

Якщо у вас є декілька стовпців для вибору з таблиці, тоді ви можете легко призначити його за допомогою одного оператора SELECT INTO замість повторення коду !!
Venkzz_venki
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.