none
SQL中变量的作用域??? RRS feed

  • 问题

  • if(@EsObjNo='B')
       begin
          declare  @No  char(20)

          set   @No='0000000000000000001'

      end

    else

    begin

        问题:在这里使用“ @No”不用再声明了,直接用就可以了。     它不像C#和Java存在局部变量,它是什么机制呢???

    end


    Science and technology is my lover.

    2012年11月14日 2:34

答案

  • LZ可以看一下TSQL中变量的作用域:msdn中的解释:

    Transact-SQL 变量

    http://msdn.microsoft.com/zh-cn/library/ms187953(v=SQL.105).aspx

    变量的作用域就是可以引用该变量的 Transact-SQL 语句的范围。变量的作用域从声明变量的地方开始到声明变量的批处理或存储过程的结尾。例如,下面的脚本存在语法错误,因为在一个批处理中引用了在另一个批处理中声明的变量:

    变量具有局部作用域,只在定义它们的批处理或过程中可见


    给我写信: QQ我:点击这里给我发消息

    • 已标记为答案 starrycheng 2012年11月14日 4:06
    2012年11月14日 2:57
  • DECLARE @EsObjNo NVARCHAR(10)
    SET @EsObjNo = 'A'
    
    
    IF ( @EsObjNo = 'B' ) 
        BEGIN
            DECLARE @No CHAR(20)
     
            SET @No = '0000000000000000001' + '111'
            PRINT @No
    --  放在位置一:      
    --GO
        END
    --  放在位置二:  
    --GO
     
    ELSE 
        BEGIN
            PRINT @No + '222'
      
     
    --    问题:在这里使用“ @No”不用再声明了,直接用就可以了。     它不像C#和Java存在局部变量,它是什么机制呢???
     
        END
    如果你去掉放在位置一或者放在位置二里的GO的注释都会报错下面的信息必须声明标量变量 "@No",就是说变量的作用域是遇到GO就会消失(如果是批处理的话)

    报错:

    消息 156,级别 15,状态 1,第 2 行
    关键字 'ELSE' 附近有语法错误。
    消息 137,级别 15,状态 2,第 4 行
    必须声明标量变量 "@No"。


    给我写信: QQ我:点击这里给我发消息


    2012年11月14日 3:35

全部回复

  • LZ可以看一下TSQL中变量的作用域:msdn中的解释:

    Transact-SQL 变量

    http://msdn.microsoft.com/zh-cn/library/ms187953(v=SQL.105).aspx

    变量的作用域就是可以引用该变量的 Transact-SQL 语句的范围。变量的作用域从声明变量的地方开始到声明变量的批处理或存储过程的结尾。例如,下面的脚本存在语法错误,因为在一个批处理中引用了在另一个批处理中声明的变量:

    变量具有局部作用域,只在定义它们的批处理或过程中可见


    给我写信: QQ我:点击这里给我发消息

    • 已标记为答案 starrycheng 2012年11月14日 4:06
    2012年11月14日 2:57
  •   问题:在这里使用“ @No”不用再声明了,直接用就可以了。     它不像C#和Java存在局部变量,它是什么机制呢??


    你不是在上面已经用 declare @No char(20) 声明了嘛


    Please click the Mark as Answer button if a post solves your problem!

    2012年11月14日 3:14
  • DECLARE @EsObjNo NVARCHAR(10)
    SET @EsObjNo = 'A'
    
    
    IF ( @EsObjNo = 'B' ) 
        BEGIN
            DECLARE @No CHAR(20)
     
            SET @No = '0000000000000000001' + '111'
            PRINT @No
    --  放在位置一:      
    --GO
        END
    --  放在位置二:  
    --GO
     
    ELSE 
        BEGIN
            PRINT @No + '222'
      
     
    --    问题:在这里使用“ @No”不用再声明了,直接用就可以了。     它不像C#和Java存在局部变量,它是什么机制呢???
     
        END
    如果你去掉放在位置一或者放在位置二里的GO的注释都会报错下面的信息必须声明标量变量 "@No",就是说变量的作用域是遇到GO就会消失(如果是批处理的话)

    报错:

    消息 156,级别 15,状态 1,第 2 行
    关键字 'ELSE' 附近有语法错误。
    消息 137,级别 15,状态 2,第 4 行
    必须声明标量变量 "@No"。


    给我写信: QQ我:点击这里给我发消息


    2012年11月14日 3:35
  • 明白了,谢谢各位大师。

    Science and technology is my lover.

    2012年11月14日 4:06