Один из возможных подходов - проанализировать массив JSON с идентификаторами, используя OPENJSON()
и схему по умолчанию, а затем сгенерировать массив JSON с именами. Схема OPENJSON()
со схемой по умолчанию возвращает таблицу со столбцами key
, value
и type
, а столбцы key
содержат индекс каждого элемента. Обратите внимание, что важной частью здесь является генерация имен в том же порядке, в каком они существуют в массиве идентификаторов JSON. Вам нужно использовать метод, основанный на агрегации строк, потому что я не думаю, что вы можете сгенерировать массив JSON со скалярными значениями, используя FOR JSON
.
Таблицы:
create table #subjectList(subjectID int identity(1,1),subjectName varchar(50))
insert into #subjectList(subjectName)
select 'Math' union all
select 'English' union all
select 'Hindi' union all
select 'PC' union all
select 'Physics'
Create table #studentList(studentID int identity(1,1), subjectName varchar(50), choseSubjectList varchar(max))
insert into #studentList(subjectName, choseSubjectList)
Select 'A','["1","2"]' union all
Select 'B','["3","2","5"]' union all
Select 'C','["6","2"]'
create table #studentWithSubject(studentID int,subjectName varchar(50),choseSubjectIDList varchar(max),choseSubjectNameList varchar(max))
insert into #studentWithSubject(studentID,subjectName,choseSubjectIDList)
Select a.studentID,a.studentID,a.choseSubjectList
from #studentList a
Заявление:
UPDATE #studentWithSubject
SET choseSubjectNameList = (
CONCAT(
'["',
STUFF(
(SELECT CONCAT('","', COALESCE(s.subjectName, ''))
FROM OPENJSON(#studentWithSubject.choseSubjectIDList) j
LEFT JOIN #subjectList s ON j.[value] = s.subjectID
ORDER BY CONVERT(int, j.[key])
FOR XML PATH('')), 1, 3, ''
),
'"]'
)
)
Результат:
studentID subjectName choseSubjectIDList choseSubjectNameList
1 1 ["1","2"] ["Math","English"]
2 2 ["3","2","5"] ["Hindi","English","Physics"]
3 3 ["6","2"] ["","English"]