【问题标题】:How to set variable from a SQL query?如何从 SQL 查询中设置变量?
【发布时间】:2011-04-27 20:14:51
【问题描述】:

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

declare @ModelID uniqueidentifer

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

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

谢谢!

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:
SELECT @ModelID = modelid
FROM Models
WHERE areaid = 'South Coast'

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

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

【讨论】:

    【解决方案2】:

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

    See this question for the difference between using SELECT and SET in TSQL.

    警告

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

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

    【讨论】:

    • 如果这个select语句返回多个值:在第一种情况下,变量被赋值为最后一个返回的值(正如womp所说),没有任何错误或警告(这可能会导致逻辑错误);第二种情况会报错。
    • 顺便说一句,使用SET的情况需要一对括号:SET @ModelID = (SELECT ...)
    • 我会使用 TOP 1 和 select,只有 1 个结果,例如SET @ModelID = (SELECT TOP 1 m.modelid FROM MODELS m WHERE m.areaid = 'South Coast')
    • 如果在返回多个值时使用set,那么如何使用异常处理来处理呢?
    • 有时,如果出现意外的重复结果,您希望得到一个错误,而不是悄悄地使用意外的结果。
    【解决方案3】:
    declare @ModelID uniqueidentifer
    
    --make sure to use brackets
    set @ModelID = (select modelid from models
    where areaid = 'South Coast')
    
    select @ModelID
    

    【讨论】:

    • 这个问题已经准备好了,不用再回答了,我什至看不出你和小马的答案有什么不同?
    • @JoshuaDuxbury 它提供了一个工作复制粘贴版本
    【解决方案4】:

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

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

    【讨论】:

    • 它实际上不会导致 SQL 错误,它会选择最后一条记录(尽管如果您使用此值并且它不正确,它可能会导致应用程序中的错误)
    【解决方案5】:
    Select @ModelID =m.modelid 
    From   MODELS m
    Where  m.areaid = 'South Coast'
    

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

    【讨论】:

      【解决方案6】:

      我更喜欢从声明语句中设置它

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          使用 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 语句轻松分配它,而不是重复代码!!
          【解决方案9】:

          有三种方法:

          1. DECLARE
          2. SET -- 微软推荐的方法
          3. 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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-08-16
            • 2011-10-18
            • 1970-01-01
            • 1970-01-01
            • 2015-06-27
            • 2011-11-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多