В моем запросе на синтаксический анализ XML у меня есть:
SELECT Id, DeveloperId, PublisherId,
Data.value('(/Game/DeveloperName/text())[1]', 'nvarchar(50)') DeveloperName,
Data.value('(/Game/PublisherName/text())[1]', 'nvarchar(50)') PublisherName,
Data.value('(/Game/Genre/text())[1]', 'nvarchar(50)') Genre,
FROM GameDataTable;
Мне было интересно, можно ли явно не писать
'DeveloperName, Publisher, Genre'
чтобы, возможно, сделать человеческие ошибки в опечатках менее распространенными и уменьшить пространство. Я думал о создании временной таблицы, но разве это не эффективно?
Если бы у кого-нибудь были какие-то советы, это было бы здорово.


Один из вариантов - нормализовать ваши данные, а затем выполнить поворот (поворот необязателен).
Пример
Declare @YourTable table (ID int,DeveloperID int,PublisherID int,Data xml)
Insert Into @YourTable values
(1,2365,10056,'<Game><DeveloperName>This is the Developer Name</DeveloperName><PublisherName>This is the Publisher Name</PublisherName><Genre>Drama</Genre></Game>')
Select *
From (
Select A.ID
,A.DeveloperID
,A.PublisherID
,B.*
From @YourTable A
Cross Apply (
Select NodeName = lvl2.n.value('local-name(.)', 'varchar(max)')
,NodeValue = lvl2.n.value('text()[1]', 'varchar(max)')
From Data.nodes('*') lvl1(n)
Cross Apply lvl1.n.nodes('*') lvl2(n)
) B
) src
Pivot (max(NodeValue) for NodeName in ([DeveloperName],[PublisherName],[Genre]) ) pvt
Возврат
Без стержня
Что это за lvl1 и lvl2?
@ Darnold14, который служил подстраховкой на случай, если у вас будет несколько узлов "уровня 1". Это необязательно. Если не нужен. Нажмите «отредактировано 3 часа назад», чтобы увидеть оригинал.
Круто, понятно. Спасибо!
@ Darnold14 Рад помочь.
Привет, извини, что беспокою! Но мне было интересно, я дурачился с этим, но знаете ли вы, почему в этой реализации столбцы со значениями GUID будут иметь значение NULL?
@ Darnold14 Ха, я посмотрю
Не беспокойтесь, я понял. Спасибо хоть!
Предполагая, что вы имеете в виду XQuery, а не псевдоним .... короткий ответ нет, почти наверняка вы не можете ссылаться на элементы по индексу, поскольку по дизайну они не обязательно должны быть в одном порядке в двух разных записях. Но если у вас есть внешние ключи для издателя / разработчика - почему у вас все равно есть те же данные в XML? Разве вы не можете присоединиться к справочным таблицам и взять значение имени из таблиц разработчика / издателя?