如何从SQL查询中设置变量?

Mr *_*ket 296 sql t-sql sql-server

我正在尝试从SQL查询中设置变量:

declare @ModelID uniqueidentifer

Select @ModelID = select modelid from models
where areaid = 'South Coast'
Run Code Online (Sandbox Code Playgroud)

显然我没有这样做,因为它不起作用.有人可以提出解决方案吗?

谢谢!

OMG*_*ies 483

使用SELECT:

SELECT @ModelID = m.modelid 
  FROM MODELS m
 WHERE m.areaid = 'South Coast'
Run Code Online (Sandbox Code Playgroud)

使用SET:

SET @ModelID = (SELECT m.modelid 
                  FROM MODELS m
                 WHERE m.areaid = 'South Coast')
Run Code Online (Sandbox Code Playgroud)

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

警告

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

  • 使用时SELECT,变量被赋予最后返回的值(如womp所述),没有任何错误或警告(这可能导致逻辑错误)
  • 使用时SET,将发生错误

  • 如果此select语句返回多个值:在第一种情况下,为变量分配返回的最后一个值(如womp所述),没有任何错误或警告(这可能导致逻辑错误); 在第二种情况下,将发生错误. (3认同)
  • 顺便说一句,使用SET的情况需要一对括号:SET @ModelID =(SELECT ...) (3认同)
  • 我会使用 TOP 1 和选择,只有 1 个结果,例如 SET @ModelID = (SELECT TOP 1 m.modelid FROM MODELS m WHERE m.areaid = 'South Coast') (2认同)

wom*_*omp 32

SELECT @ModelID = modelid
FROM Models
WHERE areaid = 'South Coast'
Run Code Online (Sandbox Code Playgroud)

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

有关对变量使用SELECT的参考:http://msdn.microsoft.com/en-us/library/aa259186%28SQL.80%29.aspx


gre*_*121 26

declare @ModelID uniqueidentifer

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

select @ModelID
Run Code Online (Sandbox Code Playgroud)

  • @JoshuaDuxbury它提供了一个工作副本粘贴版本 (3认同)

Jos*_*ury 12

我更喜欢从declare语句中设置它

DECLARE @ModelID uniqueidentifer = (SELECT modelid 
                                    FROM models
                                    WHERE areaid = 'South Coast')
Run Code Online (Sandbox Code Playgroud)


man*_*jay 10

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

SELECT TOP 1 @ModelID = m.modelid 
  FROM MODELS m
 WHERE m.areaid = 'South Coast'
Run Code Online (Sandbox Code Playgroud)

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

Ven*_*n R 8

有以下三种方法:

  1. 宣布
  2. SET -- 微软推荐的方法
  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
Run Code Online (Sandbox Code Playgroud)


Moh*_*ani 6

Select @ModelID =m.modelid 
From   MODELS m
Where  m.areaid = 'South Coast'
Run Code Online (Sandbox Code Playgroud)

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


Ven*_*nki 6

要使用 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;
Run Code Online (Sandbox Code Playgroud)

如果您必须在一行中分配多个变量,您可以使用相同的 SELECT INTO

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

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

--HAPPY CODING-- 
Run Code Online (Sandbox Code Playgroud)

  • “最佳实践”——来源? (4认同)

小智 5

您可以使用它,但是请记住您的查询给出1个结果,多个结果将引发异常。

declare @ModelID uniqueidentifer
Set @ModelID = (select Top(1) modelid from models where areaid = 'South Coast')
Run Code Online (Sandbox Code Playgroud)

其它的办法:

Select Top(1)@ModelID = modelid from models where areaid = 'South Coast'
Run Code Online (Sandbox Code Playgroud)