Sql Server 游标 循环更新字段
with cte as ()
联表查询 该单据号@billNo
中的多个FNAME
语义:查询数据,并把数据放在cte
中,cte
是自定义的一个表名
该语句之后,必须跟 使用cte
的语句,否则 ‘cte’ 会失效
;with cte as (
select A.*,B.FNAME from table1 A
inner join table2 B on A.FUSERNAME1 = B.FUSERID
inner join table3 c on c.FID = A.FID
where C.FBILLNO = @billNo
)
-- 把查询出来的FNAME列用逗号拼接起来,然后使用 LEFT(Field,len) 去除最后一个逗号
select @name = LEFT(FNAME,LEN(FNAME)-1) from (select (select CAST(FName as nvarchar(100)) + ',' from cte for xml path('') ) as FNAME) T
可以用逗号拼接多个
with t as ()
语句
;with cte1 as (
select * from table1
),
;with cte2 as (
select * from table1
)
select * from cte1,cte2
完整代码
-- 更新审核人,列字段拼接为字符串,
declare @name nvarchar(100),@billNo nvarchar(100),@num int
declare curr cursor for select FBILLNO from table3 where FAuditUser='' --声明游标
open curr --打开游标
fetch next from curr into @billNo --开始循环游标变量
while(@@FETCH_STATUS = 0) --@@FETCH_STATUS函数返回值为0表示FETCH语句执行成功
Begin
;with cte as (
select A.*,B.FNAME from table1 A
inner join table2 B on A.FUSERNAME1 = B.FUSERID
inner join table3 c on c.FID = A.FID
where C.FBILLNO = @billNo
)
select @name = LEFT(FNAME,LEN(FNAME)-1) from (select (select CAST(FName as nvarchar(100)) + ',' from cte for xml path('') ) as FNAME) T
update table3 set FAuditUser = @name where FBILLNO = @billNo
fetch next from curr into @billNo --开始循环游标变量
End
close curr --关闭游标
deallocate curr --释放游标