declare @newID int//发通知人ID
 declare @LvenNum int//循环变量
 declare @tb table (num int,StaffID int,StaffName Varchar(50))//临时表
 declare @StaffName Varchar(50)//员工姓名
 declare @StaffID int//员工ID
 set @newID=20
--建立临时表,从B表取出,所有员工ID,员工姓名,同时加上一排序列
insert @tb select ROW_Number() over(order by StaffID) as a,StaffID,StaffName from B
--遍历取值,从临时表@tb中将所有的员工ID,员工姓名依次取出,插入C,
--其中C中的NoticeReceiverID不能插入null
set @LvenNum=0
while @@rowcount<>0
begin
set @LvenNum=@LvenNum+1
select @StaffID=StaffID,@StaffName=StaffName from @tb where num=@LvenNum
insert into C(NoticeReceiverID,NoticeID,ReceiverName) values(@StaffID,@newID,@StaffName)
end为什么老是死循环..假如@tb中有38列...第39列时不就是都是为空了吗?不就@@rowcount==0,怎么不会跳出循环?

解决方案 »

  1.   

    那你的C表允许插入NULL吗?
    不可以的话,应该报错的啊!
    如果可以,那就会死的(@@rowcount取前一次的计数
    即是Insert...的)
      

  2.   

    set @LvenNum=0
    while exists (select 1 from @tb where num=@LvenNum)
    begin
    select @StaffID=StaffID,@StaffName=StaffName from @tb where num=@LvenNum
    insert into C(NoticeReceiverID,NoticeID,ReceiverName) values(@StaffID,@newID,@StaffName)
    set @LvenNum=@LvenNum+1
    end
      

  3.   

    set @LvenNum=(SELECT COUNT(*) FROM @TB)
    DELCARE @NUM INT
    SET @nUM=1
    while @NUM<=@LvenNum
    beginselect @StaffID=StaffID,@StaffName=StaffName from @tb where num=@NUM
    insert into C(NoticeReceiverID,NoticeID,ReceiverName) values(@StaffID,@newID,@StaffName)set @NUM=@NUM+1
    end
      

  4.   

    set @LvenNum=(SELECT COUNT(*) FROM @TB)
    DECLARE @NUM INT
    SET @nUM=1
    while @NUM<=@LvenNum
    beginselect @StaffID=StaffID,@StaffName=StaffName from @tb where num=@NUM
    insert into C(NoticeReceiverID,NoticeID,ReceiverName) values(@StaffID,@newID,@StaffName)set @NUM=@NUM+1
    end
      

  5.   

    set @LvenNum=(SELECT COUNT(*) FROM @TB)
    DECLARE @NUM INT
    SET @nUM=1
    while @NUM<=@LvenNum
    beginselect @StaffID=StaffID,@StaffName=StaffName from @tb where num=@NUM
    insert into C(NoticeReceiverID,NoticeID,ReceiverName) values(@StaffID,@newID,@StaffName)set @NUM=@NUM+1
    end
      

  6.   

    为什么不能用rowcount呢?你那种方法的确能执行....
    请告诉我,谢谢
      

  7.   

    select null
    --所影响的行数也是1
      

  8.   

    我是想问rowcount为什么不行....麻烦不用贴其他方法..谢谢..
      

  9.   


    --B中只有38行...
    select @StaffID=StaffID,@StaffName=StaffName from B where num=39
    print @@rowcount
    --结果为0...谁能告诉我?
      

  10.   

    declare @tb  table(id int not null)
    declare @tc  table(id int not null)insert @tb select 1
    insert @tb select 2
    insert @tb select 3
    declare @LvenNum int,@id int
    set @LvenNum=0
    while @@rowcount<>0
    begin
    set @LvenNum=@LvenNum+1
    select '@LvenNum'+ltrim(@LvenNum)
    select @Id=id from @tb where id=@LvenNum
    select @Id
    insert into @tc select @id
    end(所影响的行数为 1 行)
    (所影响的行数为 1 行)
    (所影响的行数为 1 行)                     
    -------------------- 
    @LvenNum1(所影响的行数为 1 行)            
    ----------- 
    1(所影响的行数为 1 行)
    (所影响的行数为 1 行)                     
    -------------------- 
    @LvenNum2(所影响的行数为 1 行)            
    ----------- 
    2(所影响的行数为 1 行)
    (所影响的行数为 1 行)                     
    -------------------- 
    @LvenNum3(所影响的行数为 1 行)            
    ----------- 
    3(所影响的行数为 1 行)
    (所影响的行数为 1 行)                     
    -------------------- 
    @LvenNum4(所影响的行数为 1 行)            
    ----------- 
    3(所影响的行数为 1 行)
    这样应该知道了吧
      

  11.   

    就是当超过NUM后,其它变量 的值并没有变成NULL,只是NUM在增加
      

  12.   


    --set showplan_text off
    declare @tb  table(id int not null)
    declare @tc  table(id int not null)insert @tb select 1
    insert @tb select 2
    insert @tb select 3
    declare @LvenNum int,@id int
    set @LvenNum=0
    while @@rowcount<>0
    begin
    set @LvenNum=@LvenNum+1
    select '@LvenNum='+ltrim(@LvenNum)
    set @Id=(select id from @tb where id=@LvenNum)
    select '@Id='+ltrim(@id)insert into @tc select @id
    endset @Id=(select id from @tb where id=@LvenNum)楼主,改成这样就没问题了,只是很奇怪那样执行为何就没变,
    查看了执行计划,后面写的@ID变了