我的表格XML
中的data
数据类型列records
中存储了一个XML文件。
表格如下:
create table records
(
id int,
type nvarchar(28),
data xml,
posted datetime
)
XML数据:
<Properties>
<data>
<Name>novel</Name>
<Gender>Female</Gender>
<Age>32</Age>
<Salary>55k</Salary>
<Phone>123-123</Phone>
</data>
</Properties>
我目前正在使用以下查询从该XML列中提取数据,该数据在20K记录中花费的时间超过了几分钟。
select
id,
posteddate,
CONVERT( NVARCHAR(500), data.query('data(Properties/data/Name)') ) AS Name,
CONVERT( NVARCHAR(500), data.query('data(Properties/data/Gender)') ) AS Gender,
CONVERT( NVARCHAR(500), data.query('data(Properties/data/Age)') ) AS Age,
CONVERT( NVARCHAR(500), data.query('data(Properties/data/Salary)') ) AS Salary,
CONVERT( NVARCHAR(500), data.query('data(Properties/data/Phone)') ) AS Phone
from
records
where
type = 'personnel_xml'
我是SQL Server中XML提取的新手。我想我没有遵循提取XML元素的标准优化方法。
所以,任何人都可以帮助我如何优化这种情况,因为我需要从存储为列的xml中提取100个这样的元素。
答案 0 :(得分:3)
要从SQL Server中获取XML值,您应该使用value() Method (xml Data Type)。对于无类型XML,您应指定text()
节点以获得更好的性能。
select R.id,
R.posted,
R.data.value('(/Properties/data/Name/text())[1]', 'nvarchar(500)') as Name,
R.data.value('(/Properties/data/Gender/text())[1]', 'nvarchar(10)') as Gender,
R.data.value('(/Properties/data/Age/text())[1]', 'int') as Age,
R.data.value('(/Properties/data/Salary/text())[1]', 'nvarchar(10)') as Salary,
R.data.value('(/Properties/data/Phone/text())[1]', 'nvarchar(30)') as Phone
from dbo.records as R
where type = N'personnel_xml';
答案 1 :(得分:2)
假设xml中有多个<data>
。注意我添加了一个扩展的xml文件,该文件有两组。
Declare @table table (id int,data xml)
Insert Into @table values (1,'<Properties><data><Name>novel</Name><Gender>Female</Gender><Age>32</Age><Salary>55k</Salary><Phone>123-123</Phone></data>
<data><Name>Another Name</Name><Gender>Male</Gender><Age>45</Age><Salary>75k</Salary><Phone>555-1212</Phone></data>
</Properties>')
;with cte as (
Select ID
,RN = Row_Number() over (Partition By ID Order By (Select Null))
,Data = m.query('.')
From @table AS t
Cross Apply t.Data.nodes('/Properties/data') AS A(m)
)
Select ID
,RN
,Name = Data.value('(data/Name)[1]' ,'nvarchar(500)')
,Gender = Data.value('(data/Gender)[1]','nvarchar(500)')
,Age = Data.value('(data/Age)[1]' ,'nvarchar(500)')
,Salary = Data.value('(data/Salary)[1]','nvarchar(500)')
,Phone = Data.value('(data/Phone)[1]' ,'nvarchar(500)')
From cte
返回
ID RN Name Gender Age Salary Phone
1 1 novel Female 32 55k 123-123
1 2 Another Name Male 45 75k 555-1212