declare @i int
set @i=5
while @i>0
begin
declare @n int
set @i=@i-1
set @n=isnull(@n,0)  + @i
end
select @n
这个也一样。没有测试之前我两种理解方式:1,不报错
像c#之类语言一样,循环体内的都是一个局部对象(或变量)2,报错
像basic一样,变量重复定义。

解决方案 »

  1.   

    有问题吗?sql server 的变量(包括)中当前会话中全局的, 只要在使用它之前的任意一个地方定义了就可以了
      

  2.   

    exec 或者 sp_executesql 会开启一个新的会话, 那里的变量才会与当前会话的变量隔离
      

  3.   

    1>声明了多次没报错,不应该,因为变量的作用域是当前批处理
    2>即便变量的作用域不是当前批处理而是循环内,声明了多次,但是事实上却只有一个@t,所有的数据都插入到这一个表里面了,也不应该
      

  4.   

    联机帮助上, 关于 declare 定义变量的语法说明中可以找到这个局部变量的作用域是其被声明时所在批处理
      

  5.   

    这个变量特性跟 vb ( 不是vb.net) 中的变量定义差不多