Есть ли способ удалить явные имена атрибутов при анализе XML-данных?

В моем запросе на синтаксический анализ 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' 

чтобы, возможно, сделать человеческие ошибки в опечатках менее распространенными и уменьшить пространство. Я думал о создании временной таблицы, но разве это не эффективно?

Если бы у кого-нибудь были какие-то советы, это было бы здорово.

Предполагая, что вы имеете в виду XQuery, а не псевдоним .... короткий ответ нет, почти наверняка вы не можете ссылаться на элементы по индексу, поскольку по дизайну они не обязательно должны быть в одном порядке в двух разных записях. Но если у вас есть внешние ключи для издателя / разработчика - почему у вас все равно есть те же данные в XML? Разве вы не можете присоединиться к справочным таблицам и взять значение имени из таблиц разработчика / издателя?

Dave Cullum 28.06.2018 17:51
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
1
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Один из вариантов - нормализовать ваши данные, а затем выполнить поворот (поворот необязателен).

Пример

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?

user9710116 28.06.2018 21:03

@ Darnold14, который служил подстраховкой на случай, если у вас будет несколько узлов "уровня 1". Это необязательно. Если не нужен. Нажмите «отредактировано 3 часа назад», чтобы увидеть оригинал.

John Cappelletti 28.06.2018 21:09

Круто, понятно. Спасибо!

user9710116 28.06.2018 21:21

@ Darnold14 Рад помочь.

John Cappelletti 28.06.2018 21:21

Привет, извини, что беспокою! Но мне было интересно, я дурачился с этим, но знаете ли вы, почему в этой реализации столбцы со значениями GUID будут иметь значение NULL?

user9710116 29.06.2018 13:00

@ Darnold14 Ха, я посмотрю

John Cappelletti 29.06.2018 14:00

Не беспокойтесь, я понял. Спасибо хоть!

user9710116 29.06.2018 14:02

Другие вопросы по теме