Как подружить XML и таблицы SQL SERVER, все очень просто
Ниже пример кода по разбору XML тегов, с использованием оператора CROSS APPLY,
полезными будут также примеры для XPATH
полезными будут также примеры для XPATH
DECLARE @mytable table (RawXml XML)
Insert into @mytable (RawXml)
select N'
<Rows>
<Row OrderNumber="2">
<Cell ColumnName="agrPerson" Value="77" />
<Cell ColumnName="norma" Value="" />
<Cell ColumnName="condition" Value="" />
<Cell ColumnName="denyDelete" Value="false" />
<Cell ColumnName="denyMove" Value="false" />
<Cell ColumnName="denyAdd" Value="" />
<Cell ColumnName="controlTerm" Value="true" />
<level1>
<tags>
<tag>Green</tag>
<tag>Sams</tag>
<tag>Grass</tag>
</tags>
<level2> </level2>
</level1>
</Row>
<Row OrderNumber="3">
<Cell ColumnName="agrPerson" Value="80" />
<Cell ColumnName="norma" Value="" />
<Cell ColumnName="condition" Value="" />
<Cell ColumnName="denyDelete" Value="false" />
<Cell ColumnName="denyMove" Value="false" />
<Cell ColumnName="denyAdd" Value="" />
<Cell ColumnName="controlTerm" Value="true" />
</Row>
</Rows>'
SELECT
x.XmlCol.value('@ColumnName', 'nvarchar(255)') AS ColumnName,
x.XmlCol.value('@Value', 'nvarchar(255)') AS Value
FROM @mytable b
CROSS APPLY b.RawXml.nodes('/Rows/Row/Cell') x(XmlCol)
Более сложный вариант с вложенными элементами
SELECT
row.value('@OrderNumber', 'nvarchar(255)') AS OrderNum,
tags.value('.', 'nvarchar(255)') tag,
tags.query('.') t
tags.query('.') t
FROM @mytable b
CROSS APPLY RawXml.nodes('/Rows/Row') AS row( row )
outer apply row.nodes('level1/tags/tag') tags(tags);
outer apply row.nodes('level1/tags/tag') tags(tags);
Есть другой вариант с использованием инструкции OPENXML
DECLARE @idoc int, @doc varchar(1000);
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
<OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
<OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
<Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
<OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>';
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;
-- Execute a SELECT statement that uses the OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/ROOT/Customer',1)
WITH (CustomerID varchar(10),
ContactName varchar(20));
И в результате получим
Общий список методов доступен ниже по ссылкам
Описывает, как использовать метод query() для запроса к экземпляру XML.
| |
Описывает, как использовать метод value() для получения значения типа SQL из экземпляра XML.
| |
Описывает, как использовать метод exist(), чтобы определить, вернул ли запрос непустой результат.
| |
Описывает, как использовать метод modify() и указывать инструкции Язык модификации XML-данных (XML DML) для выполнения обновлений.
| |
Описывает, как использовать метод nodes() и разделять XML на несколько строк для распространения XML-документов по наборам строк.
| |
Описывает, как выполнить внутри XML привязку данных, не относящихся к XML.
| |
Описывает правила использования методов типа данных xml.
|
SELECT *
FROM table for xml auto
Еще один полезный пример
DECLARE @mytable table (RawXml XML)
Insert into @mytable (RawXml)
select N'
<ProcessUser>
<UserLogin />
<UserFIO>Иванов иван Иванович</UserFIO>
<UserID>0</UserID>
<UserPosition>Бухгалтерия</UserPosition>
<FactUserLogin>domen/ivanov</FactUserLogin>
<FactUserFIO>Иванов иван Иванович</FactUserFIO>
<FactUserPosition />
<StartDate>2012-05-15T17:58:21.985613+04:00</StartDate>
<EndDate>2012-05-16T18:34:03.1913586+04:00</EndDate>
<Solution>Согласовать</Solution>
<SolutionResult>Согласовано</SolutionResult>
<Comment />
<AllowDelete>true</AllowDelete>
<IsPassed>true</IsPassed>
<IsCurrent>false</IsCurrent>
<SettingID>1</SettingID>
<AgrSetting ID="1" UserID="0" UserFIO="" GroupID="0" GroupName="" >
<MissIfEqualRoles />
<AllowDeleteRolesIfEqualRoles />
<Conditions />
</AgrSetting>
<MatrixPerson>
<UserID>78</UserID>
<Condition />
<TermForAgrStage>0</TermForAgrStage>
<DocFieldName />
<SetValues />
<DenyDelete>false</DenyDelete>
<DenyMove>false</DenyMove>
<DenyAdd />
<ControlTerm>true</ControlTerm>
<RoleID>9</RoleID>
</MatrixPerson>
</ProcessUser>'
select
x.XmlCol.query('.') XmlText,
x.XmlCol.query('MatrixPerson/RoleID'),
XmlCol.value('(MatrixPerson/RoleID)[1]', 'nvarchar(255)') RoleID,
XmlCol.value('(StartDate)[1]', 'nvarchar(255)') StartDate,
XmlCol.value('(EndDate)[1]', 'nvarchar(255)') EndDate,
XmlCol.value('(Solution)[1]', 'nvarchar(255)') Solution,
XmlCol.value('(SolutionResult)[1]', 'nvarchar(255)') SolutionResult,
XmlCol.value('(UserPosition)[1]', 'nvarchar(255)') UserPosition
from
(
select cast(RawXml as xml) RawXml
from @mytable
) b
CROSS APPLY b.RawXml.nodes('//ProcessUser') x(XmlCol)
where
XmlCol.value('(MatrixPerson/RoleID)[1]', 'nvarchar(255)') in ('9','21')
and XmlCol.value('(EndDate)[1]', 'nvarchar(255)') between '01.01.2013' and '31.12.2013'
- Мадам, да вы весите больше меня!!! - Да шо вы!!!!— Это просто мои женские прелести весят больше вашего мужского достоинства!!