Sql Server 循环更新字段

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  --释放游标