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,怎么不会跳出循环?
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,怎么不会跳出循环?
解决方案 »
- 如何按小时分组统计
- 求SQL,关于删除重复值的
- 求助,win2003 装的sql2008用IP登陆不上去
- 新人问下"UNION"关键字的用法
- 调查:你目前所做的产品最终用户是什么部门或者什么场所,你觉得这种产品有前途吗?(参与有分)
- 意外问题!高手请进!在线等待!
- 在存储过程中,判断一个临时表是否存在,怎样写?
- 只知道有FOXBASE,VFP等等,有没有叫“FOX数据库”的??这个名称是单一的产品还是一个系列产品?
- sql中如何生成一个不连续又不会重复的字段
- vfp中很小的两个问题!急!
- 安装完SQL Server后的几个进程都是干什么用的?
- 这个问题碰到很多次 但是这次我真的搞不定 关于远程连接失败的问题
不可以的话,应该报错的啊!
如果可以,那就会死的(@@rowcount取前一次的计数
即是Insert...的)
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
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
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
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
请告诉我,谢谢
--所影响的行数也是1
--B中只有38行...
select @StaffID=StaffID,@StaffName=StaffName from B where num=39
print @@rowcount
--结果为0...谁能告诉我?
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 行)
这样应该知道了吧
--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变了