Пожалуйста, дайте попробовать на это:
;with nv as (
select *
from (values ('A', '1'), ('B', '2'), ('C', '3'), ('D', '4')) a (Name, value))
, cv as (
select *
from (values ('aa', '1'), ('bb', '2,3'), ('cc', '3'), ('dd', '1,2,4')) a(City, value)
)
, cv2 as (
select cv.City
, case when charindex(',',cv.value)>0 then LEFT(cv.value, charindex(',',cv.value)-1) else cv.value end value
, case when charindex(',',cv.value)>0 then right(cv.value, LEN(cv.value)-len(LEFT(cv.value, charindex(',',cv.value)-1)+',')) end leftover
from cv
union all
select cv.City
, case when charindex(',',cv.leftover)>0 then LEFT(cv.leftover, charindex(',',cv.leftover)-1) else cv.leftover end value
, case when charindex(',',cv.leftover)>0 then right(cv.leftover, LEN(cv.leftover)-len(LEFT(cv.leftover, charindex(',',cv.leftover)-1)+',')) end leftover
from cv2 cv
where cv.leftover is not null
)
select *
, stuff((
select ','+nv.Name
from cv2
join nv on nv.value=cv2.value
where cv2.City=cv.City
for xml path('')
), 1, 1, '') Name
from cv
С CV2 Я расколоть значения в городе, с рекурсивным КТР. После этого я рассчитываю новое имя для каждого Города. Я не знаю, как быстро на большом столе, но я думаю, что это лучше, чем курсор.
Почему вы хотите сделать это с помощью 'CURSOR' вместо подхода на основе набора? –
, поскольку существует огромное количество имен и их соответствующих значений, поэтому я думаю, что это простой в использовании курсор. – SaNa3819
Я думаю, что основанный на наборе подход не будет очень простым здесь – BICube