【问题标题】:SQL Server variable scope in a stored procedure存储过程中的 SQL Server 变量范围
【发布时间】:2011-05-13 16:27:08
【问题描述】:

我想在 SQL Server 存储过程的 if/else 语句中声明一个变量。我知道这是相当不可能的,因为 SQL Server 不针对过程中的变量声明进行内存管理。有没有办法在 if/else 语句中定义一个变量,然后在另一个 if/else 语句中重新声明一个同名的变量?例如:

create procedure Foo
as
begin  
    if exists (x)
    begin
        declare @bob int
        set bob = 1
    end
    else
    begin
        declare @bob int
        set bob = 2
    end
end

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    来自books online

    变量的范围是可以引用该变量的 Transact-SQL 语句的范围。变量的范围从声明它的那一刻开始一直持续到声明它的批处理或存储过程结束。

    但是。没有什么能阻止你这样做:

    create procedure Foo as begin
    
    declare @bob int
    
    if exists (x)
    begin
        set @bob = 1
    end
    else
    begin
        set @bob = 2
    end
    
    end
    

    【讨论】:

      【解决方案2】:

      不,这样的 SQL 很有趣/很奇怪

      if exists 代码块之前声明变量

      所以

      declare @bob int 
      set @bob = 2 
      
      if exists(x) 
      begin   
          set @bob = 1 
      end
      

      现在,看看这些例子,猜猜会发生什么

      WHILE 1 = 2 --not true of course
      BEGIN
        DECLARE @VAR INT;
      END
      SET @VAR = 1;
      
      SELECT @VAR;
      

      这当然可以,但不是每次都初始化

      DECLARE @loop INT
      SET @loop = 0
      
      WHILE @loop <=6
      BEGIN
              DECLARE @VAR INT
              SET @VAR = COALESCE(@VAR,0) + 1
              SET @loop = @loop +1
      END
      
      SELECT @VAR
      

      【讨论】:

        【解决方案3】:

        你有什么不能做的原因吗:

        declare @bob int 
        if exists(x) 
        begin   set @bob = 1 end 
        else 
        begin  set @bob = 2 end 
        

        【讨论】:

        • 正是我要说的。听起来 OP 只是为了格式化而尝试这样做。
        • 我认为就 OP 而言,这是一个不好的特定示例,肯定存在变量没有离开 BEGIN/END 范围的情况,您可能希望在单独的和限制范围,不幸的是,这根本不可用。
        • 这就是我目前正在做的事情。我想按照我提到的方式做这件事没有技术原因。我想知道这是否可能。
        • @Yuck。不仅仅是为了格式化。我正在使用一些 .net 代码,并且很好奇是否有办法在 sql 中定义变量范围。发现我不知道是否有可能的方法。我以为没有办法,但我不知道事实或为什么你不能。
        【解决方案4】:

        您可以求助于使用动态 SQL:

        if exists (x)
        begin
            exec sp_executesql N'
                declare @bob int
                set @bob = 1
            ';
        end
        else
        begin
            exec sp_executesql N'
                declare @bob int
                set @bob = 2
            ';
        end
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多