将字符串连接到游标中的临时 table
Concate string into temp table in cursor
我有一个临时 table 结构 @temp2
像这样
route total driverID
------------------------
10B 300
7B 400
并想添加 driverID
列,其结果类似于 5555, 68989
为此,我使用光标循环另一个 table 看起来像这样
driverID routeNo
-------------------
5555 10B
68989 10B
72000 7B
这是代码
declare @driverID varchar(max)
declare @routeNew varchar(20)
DECLARE brand_cursor CURSOR FOR
select distinct driver_id, route_number from [dbcwl].[dbo].[collection_deduction_summary]
where YEAR(trans_date) = @year
and MONTH(trans_date) = @month
and route_number in (select actual_route from [dbcwl].[dbo].[livedispatchingdata_pmhs_daily_summary] where status = 'OK' and YEAR(trans_date) = @year AND month(trans_date) = @month )
and vehicle_id in (select vehicle_id from [dbcwl].[dbo].[livedispatchingdata_pmhs_daily_summary] where status = 'OK' and YEAR(trans_date) = @year AND month(trans_date) = @month )
group by route_number, driver_id
OPEN brand_cursor
FETCH NEXT FROM brand_cursor
INTO @driverID, @routeNew
WHILE @@FETCH_STATUS = 0
BEGIN
--update @temp2
update @temp2 set driverID += ','+ @driverID where routeNo = @routeNew;
FETCH NEXT FROM brand_cursor
INTO @driverID, @routeNew
END
CLOSE brand_cursor;
DEALLOCATE brand_cursor;
遗憾的是,我发现 driverID
列为空
并希望最终确定温度 table 如下所示:
route total driverID
------------------------
10B 300 5555,68989
7B 400 72000
;with cte as -- Step 1: Get all Driver Ids by routeNo
(
SELECT routeNo, driverID =
STUFF((SELECT DISTINCT ', ' + CAST(driverID AS NVARCHAR(100))
FROM #A b
WHERE b.routeNo = a.routeNo
FOR XML PATH('')), 1, 2, '')
FROM #A a
GROUP BY routeNo
)
update b -- Step 2: Update driverID accordingly.
set driverID = cte.driverID
from #B b
inner join cte on b.route = cte.routeNo
你可以string_agg()
:
update t
set t.driverID = ot.drivers
from @temp2 t join
(select ot.routeNo, string_agg(driverID, ',') as drivers
from othertable ot
group by ot.routeNo
) ot
on t.routeNo = ot.routeNo;
我有一个临时 table 结构 @temp2
像这样
route total driverID
------------------------
10B 300
7B 400
并想添加 driverID
列,其结果类似于 5555, 68989
为此,我使用光标循环另一个 table 看起来像这样
driverID routeNo
-------------------
5555 10B
68989 10B
72000 7B
这是代码
declare @driverID varchar(max)
declare @routeNew varchar(20)
DECLARE brand_cursor CURSOR FOR
select distinct driver_id, route_number from [dbcwl].[dbo].[collection_deduction_summary]
where YEAR(trans_date) = @year
and MONTH(trans_date) = @month
and route_number in (select actual_route from [dbcwl].[dbo].[livedispatchingdata_pmhs_daily_summary] where status = 'OK' and YEAR(trans_date) = @year AND month(trans_date) = @month )
and vehicle_id in (select vehicle_id from [dbcwl].[dbo].[livedispatchingdata_pmhs_daily_summary] where status = 'OK' and YEAR(trans_date) = @year AND month(trans_date) = @month )
group by route_number, driver_id
OPEN brand_cursor
FETCH NEXT FROM brand_cursor
INTO @driverID, @routeNew
WHILE @@FETCH_STATUS = 0
BEGIN
--update @temp2
update @temp2 set driverID += ','+ @driverID where routeNo = @routeNew;
FETCH NEXT FROM brand_cursor
INTO @driverID, @routeNew
END
CLOSE brand_cursor;
DEALLOCATE brand_cursor;
遗憾的是,我发现 driverID
列为空
并希望最终确定温度 table 如下所示:
route total driverID
------------------------
10B 300 5555,68989
7B 400 72000
;with cte as -- Step 1: Get all Driver Ids by routeNo
(
SELECT routeNo, driverID =
STUFF((SELECT DISTINCT ', ' + CAST(driverID AS NVARCHAR(100))
FROM #A b
WHERE b.routeNo = a.routeNo
FOR XML PATH('')), 1, 2, '')
FROM #A a
GROUP BY routeNo
)
update b -- Step 2: Update driverID accordingly.
set driverID = cte.driverID
from #B b
inner join cte on b.route = cte.routeNo
你可以string_agg()
:
update t
set t.driverID = ot.drivers
from @temp2 t join
(select ot.routeNo, string_agg(driverID, ',') as drivers
from othertable ot
group by ot.routeNo
) ot
on t.routeNo = ot.routeNo;