Sql 声明@Table未在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

我有一个简单的while循环,在循环中我声明了一个
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