我正在尝试从SQL查询中设置变量:有人可以提出解决方案吗?

谢谢!

评论

分配变量时,SET与SELECT

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

#1 楼

使用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和TSQL中的SET。

警告

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


使用SELECT时,该变量被分配了返回的最后一个值(如womp所说),没有任何错误或警告(这可能会导致逻辑错误)
使用SET时,会发生错误

评论


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

–牛cis
10-10-20在5:01

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

–牛cis
10-10-20在5:03

我会将TOP 1与select一起使用,以仅得到1个结果,例如SET @ModelID =(从模型m中的顶部选择1 m.modelid m.areaid ='South Coast')

–TPAKTOPA
16年5月16日在11:51

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

– Aasim
18年7月19日在2:47

有时,如果出现意外的重复结果,而不是悄悄地使用意外的结果,那么您会希望出错。

–丹尼斯·斯基德莫尔(Denise Skidmore)
18-10-12在17:53

#2 楼

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


如果您的select语句返回多个值,则会为变量分配最后返回的值。

有关将SELECT与变量一起使用的参考:http://msdn.microsoft.com/zh-cn/library/aa259186%28SQL.80%29.aspx

#3 楼

declare @ModelID uniqueidentifer

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

select @ModelID


评论


这个问题都准备好了,不需要再次回答,我什至看不到您和Ponies回答有什么不同?

–约书亚·达克斯伯里(Joshua Duxbury)
16 Sep 19'在10:12

@JoshuaDuxbury它提供了工作副本粘贴版本

– greg121
16 Sep 19'在10:59

#4 楼

我更喜欢只通过声明语句进行设置

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


#5 楼

如果查询返回多行,请使用TOP 1

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


评论


它实际上不会在SQL中引起错误,它会选择最后一条记录(尽管如果您使用此值并且它不正确,则可能在应用程序中导致结果错误)

– d219
18年4月30日在10:43

#6 楼

您可以使用它,但是请记住您的查询给出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'


#7 楼

共有三种方法:



DECLARE

SET-Microsoft建议的方法

SELECT

以下查询详细说明了每种方法的优缺点:

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


#8 楼

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


在这种情况下,如果您返回两个或多个结果,那么您的结果就是最后一条记录。因此,请注意这一点,如果您可能还要返回两条记录,因为您可能看不到预期的结果。

#9 楼

要使用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-- 


评论


“最佳实践”-来源?

–罗德尼·埃利斯(Rodney Ellis)
5月27日4:38

如果您有多个要从表中选择的列,那么您可以使用单个SELECT INTO语句轻松分配它,而不用重复代码!

–Venkzz_venki
5月27日8:47