【问题标题】:Declare @Table not getting recreated in while loop声明 @Table 不会在 while 循环中重新创建
【发布时间】:2014-02-14 07:01:30
【问题描述】:

我有一个简单的 while 循环,在循环中我声明了一个带有一列的 DECLARE @TABLE,它的数据类型是 id。虽然循环循环记录我只是将值插入到表变量中。每当循环循环它时,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

2

3

但我得到的输出是

1

1
2

1
2
3

这是错的。

这是正常行为还是 SQL 中的错误

【问题讨论】:

  • 在循环外声明,在循环开头截断。

标签: sql while-loop


【解决方案1】:

这很正常。 T-SQL 是一种非常奇怪的语言。变量声明会影响何时可以引用变量,但它们实际上并不参与控制流。

考虑:

IF 1 = 0
BEGIN
   DECLARE @a int
END

SET @a = 1
PRINT @a

实际上打印 1。它不会抱怨未声明的变量。

正如 Allan 在 cmets 中指出的那样,如果您希望 @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

【讨论】:

  • 我知道答案应该是删除表,但这不应该是正常情况。我认为这是 SQL 中的错误??
  • @user3309172 - 这不是错误,它只是 T-SQL 语言的工作方式。 DECLARE 引入了一个变量。从那时起,在批处理中,可以使用该变量。 DECLARE 嵌套的方式/位置无关紧要,正如我所说,它参与任何控制流(例如 IFWHILE)。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 2015-01-04
相关资源
最近更新 更多