如何通过SQL查询设置变量?


323

我正在尝试通过SQL查询设置变量:

declare @ModelID uniqueidentifer

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

显然,我没有正确执行此操作,因为它不起作用。有人可以提出解决方案吗?

谢谢!



2
它是唯一标识符。不是uniqueidentifer。
DxTx

Answers:


517

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

有关在TSQL中使用SELECT和SET之间的区别,请参见此问题

警告

如果此select语句返回多个值(开头不正确):

  • 使用时SELECT,会为变量分配返回的最后一个值(如womp所说),而不会出现任何错误或警告(这可能会导致逻辑错误)
  • 使用时SET,会发生错误

3
如果此select语句返回多个值:在第一种情况下,为变量分配返回的最后一个值(如womp所说),而没有任何错误或警告(这可能会导致逻辑错误);在第二种情况下,将发生错误。
弗朗西斯·纽

3
顺便说一句,使用SET的情况需要一对方括号:SET @ModelID =(SELECT ...)
Francis Niu

2
我将TOP 1与select一起使用,只有1个结果,例如SET @ModelID =(SELECT TOP 1 m.modelid来自模型m WHERE m.areaid ='South Coast')
TPAKTOPA

如果使用set时返回多个值,那么如何使用异常处理来处理呢?
学习者

有时,如果您有一个意外的重复结果,而不是悄悄地使用一个意外的结果,那么您会想要一个错误。
丹妮丝·斯基德莫尔


29
declare @ModelID uniqueidentifer

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

select @ModelID

这个问题都准备好了,不需要再次回答,我什至看不到您和Ponies回答有什么不同?
约书亚·达克斯伯里'09

5
@JoshuaDuxbury它提供了一个有效的复制粘贴版本
greg121 '16


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

要使用SQL ASSIGN变量选择最佳实践,如下所示

->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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.