- •Работа с xml в ms sql Server 2005, 2008
- •Использование типа данных xml Тип данных xml
- •Методы Query, Value, Exist, Modify и Nodes
- •Извлечение xml-данных с помощью предложения for xml Режим запроса raw
- •Результат:
- •Режим запроса explicit
- •Режим запроса path
- •Извлечение вложенных xml–данных
- •Индивидуальные задание:
Методы Query, Value, Exist, Modify и Nodes
Тип данных xml в SQL Server 2008 поддерживает четыре метода, с помощью которых можно запросить или изменить XML-данные.
Метод query используется для извлечения XML-данных с типом данных xml. XML-данные, извлекаемые этим методом, определяются XQuery-выражением, передаваемым в виде параметра.
4. Пример создания переменной типа XML и вывода данных из нее:
/*
В языке Transact SQL:
DECLARE – инструкция для объявления переменной
@ - обозначение переменной
SET – инструкция для присвоения значения переменной
SELECT <переменная или функция> - вывод результата на экран
*/
DECLARE @x xml
SET @x = '<ROOT><a>111</a></ROOT>'
SELECT @x.query('/ROOT/a')
5. Пример создания переменной типа XML и вывода данных из нее, определите разницу в примерах:
DECLARE @x xml
SET @x = '<ROOT><a>111</a><b><a>222</a></b></ROOT>'
SELECT @x.query('/ROOT/a')
Метод value позволяет возвратить из документа XML отдельное значение. Чтобы использовать метод value, необходимо указать XQuery-выражение, определяющее отдельный узел для запроса в XML-данных, а также тип данных Transact-SQL для возвращаемого значения.
6. Пример создания переменной типа XML и вывода данных из нее, определите разницу в примерах:
use AdventureWorksLT
DECLARE @myDoc xml
DECLARE @ProdID int, @ProductName char(15)
SET @myDoc = '<Root>
<ProductDescription ProductID="32" ProductName="Road Bike">
<Features>
<Warranty>1 year parts and labor</Warranty>
</Features>
</ProductDescription>
<ProductDescription ProductID="45" ProductName="Road Black">
<Features>
<Warranty>3 year parts and labor</Warranty>
</Features>
</ProductDescription>
</Root>'
SET @ProdID = @myDoc.value('(/Root/ProductDescription/@ProductID)[2]', 'int' )
SET @ProductName = @myDoc.value('(/Root/ProductDescription/@ProductName)[2]', 'char(15)' )
SELECT @ProdID, @ProductName
С помощью метода exist можно определить, существует ли в документе XML указанный узел. Метод exist возвращает 1 при наличии в документе одного или нескольких экземпляров указанного узла или значение 0, если этот узел не существует.
С помощью метода modify можно обновлять XML-данные с типом данных xml. В методе modify используется три расширения спецификации языка XQuery: insert, replace и delete. Эти расширения носят название XML DML.
7. Пример создания переменной типа XML с последующим редактированием:
DECLARE @myDoc xml
SET @myDoc =
'<Root>
<Location LocationID="10" >
<step>Manufacturing step 1 at this work center</step>
<step>Manufacturing step 2 at this work center</step>
</Location>
</Root>'
SELECT @myDoc
SET @myDoc.modify('insert <!-- some comment -->
after (/Root/Location[@LocationID=10]/step[1])[1]')
SELECT @myDoc;
GO
Результат:
<Root>
<Location LocationID="10">
<step>Manufacturing step 1 at this work center</step>
<!-- some comment -->
<step>Manufacturing step 2 at this work center</step>
</Location>
</Root>
Метод nodes возвращает набор строк, в котором каждый из узлов, указанных XQuery-выражением, возвращается как узел контекста, из которого можно извлекать данные последующими запросами.
8. Пример создания переменной типа XML с использованием метода Nodes():
DECLARE @x xml
SET @x='
<Root>
<row id="1"><name>Larry</name><oflw>some text</oflw></row>
<row id="2"><name>Joe</name></row>
<row id="3" />
</Root>
'
SELECT T.c.value('@id','int') as id,
T.c.query('name') as NAME
FROM @x.nodes('/Root/row') T(c)
GO
Результат:
id NAME
-----------------------
1 <name>Larry</name>
2 <name>Joe</name>
3
9. Пример создания переменной типа XML с использованием метода Convert():
declare @x xml
declare @s varchar(100)
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>'
set @x =convert (xml, @s)
select @x
10. Пример создания переменной типа XML с передачей данных в нее из реляционной таблицы:
use AdventureWorksLT
Declare @xmlDoc xml
SET @xmlDoc = (SELECT ProductModelID, Name
FROM SalesLT.ProductModel
WHERE ProductModelID=19
FOR XML AUTO, TYPE)
SELECT @xmlDoc
11. Пример создания таблицы с полем типа XML и передачей данных в нее из реляционной таблицы:
use AdventureWorksLT
CREATE TABLE T1 (c1 int, c2 xml)
go
INSERT T1(c1, c2)
SELECT 1, (SELECT ProductModelID, Name
FROM SalesLT.ProductModel
WHERE ProductModelID=19
FOR XML AUTO)
SELECT * FROM T1
go