Sql 声明@Table未在while循环中重新创建
我有一个简单的while循环,在循环中我声明了一个Sql 声明@Table未在while循环中重新创建,sql,while-loop,Sql,While Loop,我有一个简单的while循环,在循环中我声明了一个DECLARE@TABLE,其中有一列,其数据类型是id。当循环循环记录时,我只是将值插入到TABLE变量中。每当循环循环它时,应该重新创建Declare@TABLE,并且旧值不应该存在。但这并没有发生。下面是代码 Declare @V int Set @V = 1 While (@V <= 3) begin DECLARE @Changes table ( Id int ) Insert into @Chan
DECLARE@TABLE
,其中有一列,其数据类型是id。当循环循环记录时,我只是将值插入到TABLE变量中。每当循环循环它时,应该重新创建Declare@TABLE
,并且旧值不应该存在。但这并没有发生。下面是代码
Declare @V int
Set @V = 1
While (@V <= 3)
begin
DECLARE @Changes table
(
Id int
)
Insert into @Changes
Values (@V)
select * from @Changes
SET @V=@V+1
END
但我得到的结果是
1
1
2
1
2
3
这是错误的
这是SQL中的正常行为还是一个bug,这是正常的。T-SQL是一种非常奇怪的语言。变量声明会影响何时可以引用变量,但它们实际上并不参与控制流 考虑:
IF 1 = 0
BEGIN
DECLARE @a int
END
SET @a = 1
PRINT @a
实际上是打印1。它不会抱怨未声明的变量
正如Allan在评论中所指出的,如果您希望@Changes
在每个循环的开始处为空,请这样做:
Declare @V int
DECLARE @Changes table
(
Id int
)
Set @V = 1
While (@V <= 3)
begin
delete from @Changes
Insert into @Changes
Values (@V)
select * from @Changes
SET @V=@V+1
END
声明@V int
声明@Changes表
(
Id int
)
设置@V=1
虽然(@V在循环外声明它,并在循环开始时截断它。我知道答案应该是删除表,但这不应该是正常情况。我认为这是SQL中的一个错误???@user3309172-这不是一个错误,只是T-SQL语言的工作方式。Declare
引入了一个变量。从那时起,在在批处理中,可以使用该变量。无论声明是如何/在何处嵌套的,正如我所说的,它不参与任何控制流(例如IF
或WHILE
)。
Declare @V int
DECLARE @Changes table
(
Id int
)
Set @V = 1
While (@V <= 3)
begin
delete from @Changes
Insert into @Changes
Values (@V)
select * from @Changes
SET @V=@V+1
END