Вы можете использовать метод nodes
xml (подробнее здесь ), чтобы уничтожить xml, применить фильтрацию атрибутов и извлечь информацию из атрибута value
.
Вы можете использовать cross apply
, чтобы распространить эту операцию на все теги <entry>
Вот базовый запрос c, который вы можете использовать в качестве отправной точки:
declare @src nvarchar(max)='
<Attributes>
<Map>
<entry key="costcenter">
<value>
<List>
<String>R03e</String>
<String>L07e</String>
</List>
</value>
</entry>
<entry key="department" value="Information Technology"/>
<entry key="email" value="Paul.Walker@demoexample.com"/>
<entry key="employeeId" value="1a2a3b4d"/>
<entry key="firstName" value="Paul"/>
<entry key="fullName" value="Paul.Walker"/>
<entry key="inactiveIdentity" value="FALSE"/>
<entry key="lastName" value="Walker"/>
<entry key="location" value="Austin"/>
<entry key="managerId" value="1a2c3a4d"/>
<entry key="region" value="Americas"/>
</Map>
</Attributes>'
;with x as
(
select cast(@src as xml) as attributes
)
select
costcenter.s.value('.', 'nvarchar(max)') as costcenter
, department.s.value('.', 'nvarchar(max)') as department
, email.s.value('.', 'nvarchar(max)') as email
, employeeId.s.value('.', 'nvarchar(max)') as employeeId
, firstName.s.value('.', 'nvarchar(max)') as firstName
, fullName.s.value('.', 'nvarchar(max)') as fullName
, inactiveIdentity.s.value('.', 'nvarchar(max)') as inactiveIdentity
, lastName.s.value('.', 'nvarchar(max)') as lastName
, loc.s.value('.', 'nvarchar(max)') as [location]
, managerID.s.value('.', 'nvarchar(max)') as managerId
, region.s.value('.', 'nvarchar(max)') as region
from x
CROSS APPLY attributes.nodes('//entry[@key = "costcenter"]/value') costcenter(s)
CROSS APPLY attributes.nodes('//entry[@key = "department"]/@value') department(s)
CROSS APPLY attributes.nodes('//entry[@key = "email"]/@value') email(s)
CROSS APPLY attributes.nodes('//entry[@key = "employeeId"]/@value') employeeId(s)
CROSS APPLY attributes.nodes('//entry[@key = "firstName"]/@value') firstName(s)
CROSS APPLY attributes.nodes('//entry[@key = "fullName"]/@value') fullName(s)
CROSS APPLY attributes.nodes('//entry[@key = "inactiveIdentity"]/@value') inactiveIdentity(s)
CROSS APPLY attributes.nodes('//entry[@key = "lastName"]/@value') lastName(s)
CROSS APPLY attributes.nodes('//entry[@key = "location"]/@value') loc(s)
CROSS APPLY attributes.nodes('//entry[@key = "managerId"]/@value') managerID(s)
CROSS APPLY attributes.nodes('//entry[@key = "region"]/@value') region(s)
Результаты :
введите описание изображения здесь
PS В будущем, пожалуйста, следуйте совету, который вы получили в комментариях: опубликуйте код, который вы пробовали до сих пор, выделив проблемы, которые вы не смогли решить.