Биты и байты.

Биты и байты.

вторник, 17 декабря 2013 г.

Как подружить XML и SQL SERVER?


Как подружить XML и  таблицы SQL SERVER, все очень просто


Ниже пример кода по разбору XML тегов, с использованием оператора CROSS APPLY,
полезными будут также примеры для 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     
     FROM  @mytable b
       CROSS APPLY RawXml.nodes('/Rows/Row') AS row( row )
       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.


Можно из таблицы сделать XML достаточно указать конструкцию FOR 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'

На этом финиш, а кто дочитал тому плюшки….

- Мадам, да вы весите больше меня!!! - Да шо вы!!!!— Это просто мои женские прелести весят больше вашего мужского достоинства!!

Читшит здесь
https://devhints.io/xpath


найти брата

About