4

以下代码将无限循环。但是,在 SSMS 中停止查询后,该表为空。更改if @id is not nullif @@rowcount > 0将得到预期的结果。为什么@id 为空时没有得到空值#t

select 100 id into #t
l:
declare @id int
select top 1 @id = Id from #t 

if @id is not null
begin
    print @id

    --begin try
        raiserror ('Test error', 16, 10)
    --end try
    --begin catch
    --end catch  
    delete from #t where Id = @id
    goto l
end
(1 行受影响)
100
消息 50000,第 16 级,状态 10,第 10 行
测试错误

(1 行受影响) --------- 该行已在此处删除。
100
消息 50000,第 16 级,状态 10,第 10 行
测试错误

(0 行受影响)
100
消息 50000,第 16 级,状态 10,第 10 行
测试错误

……

更新:
更改select top 1 @id = Id from #tset @id = (select top 1 Id from #t)正常工作。

4

3 回答 3

5

如果为空,则select不会为它赋值:@id#t

select top 1 @id = Id from #t 

一种解决方法:

set @id = null
select top 1 @id = Id from #t 
于 2013-07-03T05:42:54.877 回答
2

试试这个——

SET NOCOUNT ON;

DECLARE @temp TABLE (Id INT)

INSERT INTO @temp (Id)
VALUES (1),(2)

DECLARE @id INT

WHILE EXISTS(SELECT 1 FROM @temp) BEGIN

     SELECT TOP 1 @id = Id 
     FROM @temp 

     RAISERROR ('Test error', 16, 10)
     DELETE FROM @temp WHERE Id = @id

END 
于 2013-07-03T05:43:37.733 回答
1

改变

select top 1 @id = Id from #t 

select @id = (select top 1 Id from #t)` 

很容易解决。

于 2013-07-03T15:43:52.007 回答