Как установить переменную из запроса SQL?

324

Я пытаюсь установить переменную из запроса SQL:

declare @ModelID uniqueidentifer

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

Очевидно, я не делаю это правильно, так как это не работает. Может кто-нибудь предложить решение?

Спасибо!

Мистер крикет
источник
2
Это уникальный идентификатор. Не уникальный идентификатор.
DxTx

Ответы:

519

Использование 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 переменной присваивается последнее возвращаемое значение (как сказано в womp) без каких-либо ошибок или предупреждений (это может вызвать логические ошибки)
  • При использовании SETпроизойдет ошибка
OMG пони
источник
3
Если этот оператор select возвращает несколько значений: в первом случае переменной присваивается последнее возвращаемое значение (как сказано в womp) без каких-либо ошибок или предупреждений (это может вызвать логические ошибки); во втором случае произойдет ошибка.
Фрэнсис Ниу
3
Кстати, в случае использования SET требуется пара скобок: SET @ModelID = (SELECT ...)
Фрэнсис Ниу
2
Я бы использовал TOP 1 с select, чтобы получить только 1 результат, например SET @ModelID = (SELECT TOP 1 m.modelid ИЗ МОДЕЛЕЙ m WHERE m.areaid = 'South Coast')
TPAKTOPA
В случае использования set, когда возвращаются несколько значений, как с этим обращаться, используя обработку исключений?
ученик
Иногда вы хотите получить ошибку, если есть неожиданный дублированный результат, а не тихо, используя неожиданный результат.
Дениз Скидмор
37
SELECT @ModelID = modelid
FROM Models
WHERE areaid = 'South Coast'

Если ваш оператор выбора возвращает несколько значений, вашей переменной присваивается последнее возвращаемое значение.

Для справки по использованию SELECT с переменными: http://msdn.microsoft.com/en-us/library/aa259186%28SQL.80%29.aspx

WOMP
источник
29
declare @ModelID uniqueidentifer

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

select @ModelID
greg121
источник
На этот вопрос все готово есть ответ, на который не нужно было отвечать снова, я даже не вижу, что отличается между твоим ответом и пони?
Джошуа Даксбери
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'
Pranay_Sharma_Ind
источник
4
Select @ModelID =m.modelid 
From   MODELS m
Where  m.areaid = 'South Coast'

В этом случае, если у вас есть два или более возвращенных результатов, то ваш результат является последней записью. Так что помните об этом, если вам могут быть возвращены еще две записи, поскольку вы можете не увидеть ожидаемый результат.

Мохаммад Фарахани
источник
4

Есть три подхода:

  1. DECLARE
  2. УСТАНАВЛИВАТЬ - 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

Для присвоения переменных с помощью 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-- 
Venkzz_venki
источник
«Лучшая практика» - источник?
Родни Эллис
Если у вас есть более одного столбца для выбора из таблицы, вы можете легко назначить его с помощью одного оператора SELECT INTO вместо повторения кода !!
Venkzz_venki