SQL Server: как получить атрибуты XML в запросе?
В настоящее время я пытаюсь получить все атрибуты из XML с SQL-запросом.
Я пытаюсь выполнить следующее, чтобы получить его, но я должен упустить что-то довольно фундаментальное.
DECLARE @T varchar(max)
SET @T =
'<root>
<Field FieldRowId="1000">
<Items>
<Item Name="CODE"/>
<Item Name="DATE"/>
</Items>
<Attributes>
<Attribute ID ="1"/>
</Attributes>
</Field>
<Field FieldRowId="2000">
<Items>
<Item Name="CODE"/>
<Item Name="DATE"/>
</Items>
<Attributes>
<Attribute ID ="2"/>
</Attributes>
</Field>
</root>'
DECLARE @X xml
SET @X = CAST(@T as xml)
SELECT Y.ID.value('@FieldRowId', 'int') as FieldID,
Y.ID.value('/Items/@Name', 'varchar(max)') as "Name",
Y.ID.value('/Attributes/@ID', 'int') as AttributeID
FROM @X.nodes('/root/Field') as Y(ID)
Ответы
Ответ 1
Вам нужно попробовать что-то вроде этого: (атрибут @name находится в элементе "Item", а не "Items"!)
SET @X = CAST(@T as xml)
SELECT
Y.ID.value('(@FieldRowId)[1]', 'int') as FieldID,
Y.ID.value('(Items/Item/@Name)[1]', 'varchar(max)') as "Name",
Y.ID.value('(Attributes/Attribute/@ID)[1]', 'int') as AttributeID
FROM @X.nodes('/root/Field') as Y(ID)
Марк
Ответ 2
SELECT t1.fieldId, name, attributeId
FROM ( SELECT Y.ID.value('../../@FieldRowId', 'int') as FieldID
, Y.ID.value('@Name', 'varchar(max)') as Name
FROM @T.nodes('(/root/Field/Items/Item)') as Y(ID)
) t1 -- alias the first result
JOIN
(SELECT Y.ID.value('../../@FieldRowId', 'int') as FieldID
, Y.ID.value('@ID', 'int') as AttributeID
FROM @T.nodes('(/root/Field/Attributes/Attribute)') as Y(ID)
) t2 -- alias the second result
on t1.fieldid = t2.FieldID -- join them on a common column