SQL Server解析XML数据的方法详解
本文实例讲述了SQL Server解析XML数据的方法。分享给大家供大家参考,具体如下: --5.读取XML--下面为多种方法从XML中读取EMAILDECLARE @x XMLSELECT @x = 'People dongsheng Info Name="Email"dongsheng@xxyy.c
本文实例讲述了SQL Server解析XML数据的方法。分享给大家供大家参考,具体如下:
--5.读取XML
--下面为多种方法从XML中读取EMAIL
DECLARE @x XML
SELECT @x = '
dongsheng 男 5454545454 土豆 女 5345454554 / --方法2 SELECT C.value('@NAME[1]','VARCHAR(10)') AS NAME, C.value('@SEX[1]','VARCHAR(10)') AS SEX, C.value('@QQ[1]','VARCHAR(20)') AS QQ FROM @x.nodes('//Employee[@dept="IT"]/') T(C) /* NAME SEX QQ
dongsheng 男 5454545454 土豆 女 5345454554 / --查询出IT部门type为Permanent的员工 SELECT C.value('@NAME[1]','VARCHAR(10)') AS NAME, C.value('@SEX[1]','VARCHAR(10)') AS SEX, C.value('@QQ[1]','VARCHAR(20)') AS QQ FROM @x.nodes('//Employee[@dept="IT"][@type="合同工"]/') T(C) /* NAME SEX QQ
dongsheng 男 5454545454
/
--12.从XML变量中删除元素
DECLARE @x XML
SELECT @x = '
土豆
男
5345454554
'
SET @x.modify('
delete (/Peoples/People/SEX)[1]'
)
SELECT @x
/
土豆
5345454554
/
--19.读取指定变量元素的值
DECLARE @x XML
SELECT @x = '
dongsheng
男
423545
土豆
男
123133
choushuigou
女
54543545
'
DECLARE @ElementName VARCHAR(20)
SELECT @ElementName = 'NAME'
SELECT c.value('.','VARCHAR(20)') AS NAME
FROM @x.nodes('/Peoples/People/[local-name()=sql:variable("@ElementName")]') T(C)
/*
NAME
dongsheng
土豆
choushuigou
/
--20使用通配符读取元素值
--读取根元素的值
DECLARE @x1 XML
SELECT @x1 = 'dongsheng '
SELECT @x1.value('(//text())[1]','VARCHAR(20)') AS People --星号代表一个元素
/
People
dongsheng
/
--读取第二层元素的值
DECLARE @x XML
SELECT @x = '
dongsheng
男
423545
'
SELECT
@x.value('(///text())[1]','VARCHAR(20)') AS NAME
/
NAME
dongsheng
/
--读取第二个子元素的值
DECLARE @x XML
SELECT @x = '
dongsheng
男
423545
'
SELECT
@x.value('(///text())[2]','VARCHAR(20)') AS SEX
/
SEX
男
/
--读取所有第二层子元素值
DECLARE @x XML
SELECT @x = '
dongsheng
男
423545
'
SELECT
C.value('.','VARCHAR(20)') AS value
FROM @x.nodes('//') T(C)
/
value
dongsheng
男
423545
/
--21.使用通配符读取元素名称
DECLARE @x XML
SELECT @x = 'dongsheng '
SELECT
@x.value('local-name(/[1])','VARCHAR(20)') AS ElementName
/*
ElementName
People
/
--读取根下第一个元素的名称和值
DECLARE @x XML
SELECT @x = '
NAME dongsheng
/
--读取根下第二个元素的名称和值
DECLARE @x XML
SELECT @x = '
SEX 男
/
--读取根下所有的元素名称和值
DECLARE @x XML
SELECT @x = '
NAME dongsheng
SEX 男
/
---22.查询元素数量
--如下Peoples根节点下有个People子节点。
DECLARE @x XML
SELECT @x = '
dongsheng
男
土豆
男
choushuigou
女
'
SELECT @x.value('count(/Peoples/People)','INT') AS Children
/
Children
3 / --如下Peoples根节点下第一个子节点People下子节点的数量 SELECT @x.value('count(/Peoples/People[1]/)','INT') AS Children /* Children
2 / --某些时候我们可能不知道根节点和子节点的名称,可以用通配符来代替。 SELECT @x.value('count(//)','INT') AS ChildrenOfRoot, @x.value('count(//[1]/)','INT') AS ChildrenOfFirstChildElement /* ChildrenOfRoot ChildrenOfFirstChildElement
3 2
/
--23.查询属性的数量
DECLARE @x XML
SELECT @x = '
'
--查询跟节点的属性数量
SELECT @x.value('count(/Employees/@)','INT') AS AttributeCountOfRoot
/*
AttributeCountOfRoot
1 / --第一个Employee节点的属性数量 SELECT @x.value('count(/Employees/Employee[1]/@)','INT') AS AttributeCountOfFirstElement /* AttributeCountOfFirstElement
3 / --第二个Employee节点的属性数量 SELECT @x.value('count(/Employees/Employee[2]/@)','INT') AS AttributeCountOfSeconfElement /* AttributeCountOfSeconfElement
4 / --如果不清楚节点名称可以用通配符代替 SELECT @x.value('count(//@)','INT') AS AttributeCountOfRoot ,@x.value('count(//[1]/@)','INT') AS AttributeCountOfFirstElement ,@x.value('count(//[2]/@)','INT') AS AttributeCountOfSeconfElement /* AttributeCountOfRoot AttributeCountOfFirstElement AttributeCountOfSeconfElement
1 3 4 / --返回没个节点的属性值 SELECT C.value('count(./@)','INT') AS AttributeCount FROM @x.nodes('//') T(C) /* AttributeCount
3
4
/
--24.返回给定位置的属性值或者名称
DECLARE @x XML
SELECT @x = '
'
--返回第一个Employee节点的第一个位置的属性值
SELECT @x.value('(/Employees/Employee[1]/@[position()=1])[1]','VARCHAR(20)') AS AttValue
/*
AttValue
dongsheng / --返回第二个Employee节点的第四个位置的属性值 SELECT @x.value('(/Employees/Employee[2]/@[position()=4])[1]','VARCHAR(20)') AS AttValue /* AttValue
13954697895 / --返回第一个元素的第三个属性值 SELECT @x.value('local-name((/Employees/Employee[1]/@[position()=3])[1])','VARCHAR(20)') AS AttName /* AttName
QQ / --返回第二个元素的第四个属性值 SELECT @x.value('local-name((/Employees/Employee[2]/@[position()=4])[1])','VARCHAR(20)') AS AttName /* AttName
TEL / --通过变量传递位置返回属性值 DECLARE @Elepos INT,@Attpos INT SELECT @Elepos=2,@Attpos = 3 SELECT @x.value('local-name((/Employees/Employee[sql:variable("@Elepos")]/@[position()=sql:variable("@Attpos")])[1])','VARCHAR(20)') AS AttName /* AttName
QQ
/
--25.判断是XML中否存在相应的属性
DECLARE @x XML
SELECT @x = ' '
IF @x.exist('/Employee/@NAME') = 1
SELECT 'Exists' AS Result
ELSE
SELECT 'Does not exist' AS Result
/
Result
Exists
/
--传递变量判断是否存在
DECLARE @x XML
SELECT @x = ' '
DECLARE @att VARCHAR(20)
SELECT @att = 'QQ'
IF @x.exist('/Employee/@[local-name()=sql:variable("@att")]') = 1
SELECT 'Exists' AS Result
ELSE
SELECT 'Does not exist' AS Result
/*
Result
Exists
/
--26.循环遍历元素的所有属性
DECLARE @x XML
SELECT @x = '
SQL Server 中对XML数据的五种基本操作
1.xml.exist 输入为XQuery表达式,返回0,1或是Null。0表示不存在,1表示存在,Null表示输入为空 2.xml.value 输入为XQuery表达式,返回一个SQL Server标量值 3.xml.query 输入为XQuery表达式,返回一个SQL Server XML类型流 4.xml.nodes 输入为XQuery表达式,返回一个XML格式文档的一列行集 5.xml.modify
使用XQuery表达式对XML的节点进行insert , update 和 delete 操作。
下面通过例子对上面的五种操作进行说明:
declare @XMLVar xml = '
1. xml.exist
select @XMLVar.exist('/catalog/book')-----返回1 select @XMLVar.exist('/catalog/book/@category')-----返回1 select @XMLVar.exist('/catalog/book1')-----返回0 set @XMLVar = null select @XMLVar.exist('/catalog/book')-----返回null
2.xml.value
select @XMLVar.value('/catalog[1]/book[1]','varchar(MAX)') select @XMLVar.value('/catalog[1]/book[2]/@category','varchar(MAX)') select @XMLVar.value('/catalog[2]/book[1]','varchar(MAX)')
结果集为: Windows Step By StepBill Zack49.99 Developer NULL 3.xml.query
select @XMLVar.query('/catalog[1]/book') select @XMLVar.query('/catalog[1]/book[1]') select @XMLVar.query('/catalog[1]/book[2]/author')
结果集分别为:
4.xml.nodes
select T.c.query('.') as result from @XMLVar.nodes('/catalog/book') as T(c) select T.c.query('title') as result from @XMLVar.nodes('/catalog/book') as T(c)
结果集分别为:
set ARITHABORT on
DECLARE @x XML
SELECT @x = '
/ 解析XML存储过程 / ALTER PROCEDURE [dbo].[sp_ExportXml] @x xml , @layerstr nvarchar(max) AS DECLARE @sql nvarchar(max) BEGIN set arithabort on set @sql='select p.* FROM( SELECT C.value(''local-name(.)'',''VARCHAR(20)'') AS attrName, C.value(''.'',''VARCHAR(20)'') AS attrValue FROM @xmlParas.nodes('''+@layerstr+''') T(C) ) as p' --print @sql EXECUTE sp_executesql @sql, N'@xmlParas as xml',@xmlParas=@x END
DECLARE @x XML
SELECT @x =
'
希望本文所述对大家SQL Server数据库程序设计有所帮助。