SQL XML类型的查询
XML 类型的出现,应该说是程序员们的一大福音,帮我们解决了很多以前没有办法解决的问题,这里提供XML类型基本的操作方式,供大家参考。如下为查询的操作,下一篇将提供更新,插入等操作。
Code
查询XML节点 value:通过nodes 指定到节点通过Value属性取出值
Declare @Xml xml
set @Xml='<Employee><ID>1</ID><ID>2</ID></Employee>'
SELECT ID.value('.','Nvarchar(500)') as EmployeeID
FROM @Xml.nodes('Employee/ID') Employee(ID)
查询 XML节点的属性:
Declare @Xml xml
set @Xml='<Employee><EmployeeID ID="1" /><EmployeeID ID="2" /><EmployeeID ID="3" /></Employee>'
SELECT EmployeeID.value('./@ID','Nvarchar(500)') as ReportColumnID
FROM @Xml.nodes('/Employee/EmployeeID')
X(EmployeeID)
查询XML 多节点的值,可以通过子查询实现:
Declare @Xml xml
Set @Xml = '
<X>
<T><ID>1</ID><NAME>A1</NAME></T>
<T><ID>2</ID><NAME>B2</NAME></T>
<T><ID>3</ID><NAME>C3</NAME></T>
</X>'
SELECT ID.value('.', 'NVARCHAR(100)') As ID,NAME.value('.','NVARCHAR(100)') As NAME
FROM
(
Select
T.C.query('ID') As ID,
T.C.query('NAME') As NAME
From
@Xml.nodes('/X/T') As T(C)
)BT
OPENXML 查询方式:
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot" />
</ROOT>'
---创建文档内部格式
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
SELECT *
FROM OPENXML (@idoc, '/ROOT/Customer',1)
WITH (CustomerID varchar(10),
ContactName varchar(20))
OPENXML 查询方式:
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order OrderID="10248" CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
<OrderDetail ProductID="11" Quantity="12"/>
<OrderDetail ProductID="42" Quantity="10"/>
</Order>
</Customer>
</ROOT>'
---创建文档内部格式
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
SELECT *
FROM OPENXML (@idoc, '/ROOT/Customer/Order/OrderDetail',2)
WITH (OrderID int '../@OrderID',
CustomerID varchar(10) '../@CustomerID',
OrderDate datetime '../@OrderDate',
ProdID int '@ProductID',
Qty int '@Quantity')
查询XML节点 value:通过nodes 指定到节点通过Value属性取出值
Declare @Xml xml
set @Xml='<Employee><ID>1</ID><ID>2</ID></Employee>'
SELECT ID.value('.','Nvarchar(500)') as EmployeeID
FROM @Xml.nodes('Employee/ID') Employee(ID)
查询 XML节点的属性:
Declare @Xml xml
set @Xml='<Employee><EmployeeID ID="1" /><EmployeeID ID="2" /><EmployeeID ID="3" /></Employee>'
SELECT EmployeeID.value('./@ID','Nvarchar(500)') as ReportColumnID
FROM @Xml.nodes('/Employee/EmployeeID')
X(EmployeeID)
查询XML 多节点的值,可以通过子查询实现:
Declare @Xml xml
Set @Xml = '
<X>
<T><ID>1</ID><NAME>A1</NAME></T>
<T><ID>2</ID><NAME>B2</NAME></T>
<T><ID>3</ID><NAME>C3</NAME></T>
</X>'
SELECT ID.value('.', 'NVARCHAR(100)') As ID,NAME.value('.','NVARCHAR(100)') As NAME
FROM
(
Select
T.C.query('ID') As ID,
T.C.query('NAME') As NAME
From
@Xml.nodes('/X/T') As T(C)
)BT
OPENXML 查询方式:
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot" />
</ROOT>'
---创建文档内部格式
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
SELECT *
FROM OPENXML (@idoc, '/ROOT/Customer',1)
WITH (CustomerID varchar(10),
ContactName varchar(20))
OPENXML 查询方式:
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order OrderID="10248" CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
<OrderDetail ProductID="11" Quantity="12"/>
<OrderDetail ProductID="42" Quantity="10"/>
</Order>
</Customer>
</ROOT>'
---创建文档内部格式
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
SELECT *
FROM OPENXML (@idoc, '/ROOT/Customer/Order/OrderDetail',2)
WITH (OrderID int '../@OrderID',
CustomerID varchar(10) '../@CustomerID',
OrderDate datetime '../@OrderDate',
ProdID int '@ProductID',
Qty int '@Quantity')