• XML常用方法


    Examples:

     

    --1、表連接條件查詢

     

    DECLARE   @names   XML 

      SET  @names   =   '<root> 

     <row  id="1">aa</row> 

     <row  id="2">bb</row> 

     </root>' 

      

    SELECT   

        A.id, 

        name   =   @names.value('(/root/row[@id=sql:column("A.id")])[1]',   'varchar(10)') 

    FROM( 

        SELECT  id   =   1   UNION   ALL 

        SELECT  id   =   2 

    )A  

     

    /*

    id  name

    1   aa

    2   bb

    */

     

     

    --2、變量傳參

     

    go

     

    DECLARE   @a   XML 

    SET   @a   =   '<root> 

    <row  id="1">aa</row> 

    <row  id="2">bb</row> 

    </root>' 

     

    DECLARE   @id   int 

    SET   @id   =   2 

    SELECT   @a.value('(/root/row[@id=sql:variable("@id")])[1]',   'varchar(10)')  

     

     

    --3、條件exist用法

    IF OBJECT_ID('Tempdb..#T') IS NOT NULL

        DROP TABLE #T

    CREATE TABLE #T (

        ProductID          int primary key,

       CatalogDescription xml)

    Go

    insert into #T values(1,'<ProductDescriptionProductID="1" ProductName="SomeName" />')

    go

     

    SELECT ProductID,

        CatalogDescription.value('(/ProductDescription/@ProductName)[1]', 'varchar(40)') as PName,

        t.CatalogDescription.exist('/ProductDescription[@ProductName="SomeName"]') AS IsExists

    FROM #T AS T

    where t.CatalogDescription.exist('/ProductDescription[@ProductName="SomeName"]')=1

    /*

    ProductID   PName   IsExists

    1   SomeName    1

    */

    GO

     

    --4XMLnodes+CROSS APPLY 應用

     

    Declare @x XML

    Set @x ='

    <RelOp NodeId="10"PhysicalOp="Index Seek" LogicalOp="Index Seek" >

         <OutputList>

           <ColumnReference Column="Bmk1010" />

           <ColumnReference Database="[DB1]" Schema="[dbo]"Table="[Tab2]" Alias="[Tab2]"Column="DateModified" />

           <ColumnReference Database="[DB1]" Schema="[dbo]"Table="[Tab2]" Alias="[Tab2]" Column="FID" />

         </OutputList>

    <Object Database="[DB1]"Schema="[dbo]" Table="[Tab2]" Index="[IX_Tab2_1]"Alias="[Tab2]" />

         <OutputList>

           <ColumnReference Column="Bmk1010" />

           <ColumnReference Database="[DB1]" Schema="[dbo]"Table="[Tab2]" Alias="[Tab2]"Column="DateModified" />

           <ColumnReference Database="[DB1]" Schema="[dbo]"Table="[Tab2]" Alias="[Tab2]" Column="FID" />

         </OutputList>

    <Object Database="[DB1]"Schema="[dbo]" Table="[[Tab1]]"Index="[IX_Tab2_3]" Alias="[[Tab1]]" />

         <OutputList>

           <ColumnReference Column="Bmk1010" />

           <ColumnReference Database="[DB1]" Schema="[dbo]"Table="[Tab2]" Alias="[Tab2]"Column="DateModified" />

           <ColumnReference Database="[DB1]" Schema="[dbo]"Table="[Tab2]" Alias="[Tab2]" Column="FID" />

         </OutputList>

     

    </RelOp>

    <RelOp NodeId="12" >

         <OutputList>

           <ColumnReference Column="Bmk1010" />

           <ColumnReference Database="[DB1]" Schema="[dbo]"Table="[Tab2]" Alias="[Tab2]"Column="DateModified" />

           <ColumnReference Database="[DB1]" Schema="[dbo]"Table="[Tab2]" Alias="[Tab2]" Column="FID" />

         </OutputList>

     

    <Object Database="[DB1]"Schema="[dbo]" Table="[Tab2]" Alias="[Tab2]"/>

         <OutputList>

           <ColumnReference Column="Bmk1010" />

           <ColumnReference Database="[DB1]" Schema="[dbo]"Table="[Tab2]" Alias="[Tab2]"Column="DateModified" />

           <ColumnReference Database="[DB1]" Schema="[dbo]"Table="[Tab2]" Alias="[Tab2]" Column="FID" />

         </OutputList>

     

    </RelOp>

    '

    select

        t.c.value('@Database','nvarchar(255)') Databse

        ,t.c.value('@Table','nvarchar(255)')    tbls

        ,t.c.value('@Index','nvarchar(255)')    indxs  

    from @x.nodes('//Object') t(c)

    /*

    Databsetbls    indxs

    [DB1]   [Tab2]  [IX_Tab2_1]

    [DB1]   [[Tab1]]    [IX_Tab2_3]

    [DB1]   [Tab2]  NULL

    */

     

    Select

        u.d.value('@NodeId','nvarchar(255)') NodeId

    From @x.nodes('//RelOp') u(d)

    /*

    10

    12

    */

     

    SELECT

        u.d.value('@NodeId','nvarchar(255)') NodeId,

        t.c.value('@Database','nvarchar(255)') Databse,

        t.c.value('@Table','nvarchar(255)')tbls,

        t.c.value('@Index','nvarchar(255)')indxs

    FROM @x.nodes('RelOp') u(d)

        CROSS APPLY u.d.nodes('Object') t(c)

    /*

     

    NodeId  Databsetbls    indxs

    10  [DB1]   [Tab2]  [IX_Tab2_1]

    10  [DB1]   [[Tab1]]    [IX_Tab2_3]

    12  [DB1]   [Tab2]  NULL

     

    */

     

    --5XML的排序號DENSE_RANK

     

    DECLARE @x2 XML

    SET @x2 = '<a><b><c>abc</c><c>def</c></b><b><c>abc</c><c>def</c></b></a>'

     

    SELECT

        b_nodes.unique_b_node,

        c_node.value('(./text())[1]', 'varchar(50)') AS c_val

    FROM

    (

        SELECT

            b_node.query('.') AS b_xml,

            b_node.value('for $s in . return count(../*[. << $s]) + 1', 'int') AS unique_b_node

        FROM @x2.nodes('/a/b') AS b (b_node)

    ) b_nodes

    CROSS APPLY b_nodes.b_xml.nodes('/b/c') AS c (c_node)

     

     

    SELECT 

        DENSE_RANK() OVER (ORDER BY b_node) AS unique_b_node,

        c_node.value('(./text())[1]', 'varchar(50)') AS c_val

    FROM @x2.nodes('/a/b') AS b (b_node)

    CROSS APPLY b.b_node.nodes('./c') AS c (c_node)

     

    /*

    unique_b_node   c_val

    1   abc

    1   def

    2   abc

    2   def

    */

  • 相关阅读:
    PHP迭代器
    PDO

    五种常见的 PHP 设计模式
    php fastcgi_finish_request 函数的理解
    vagrant up 启动虚拟机报错
    thrift php 的使用
    python 基本知识学习(一)
    PHP实现进程间通信:消息队列 msg_get_queue 函数不存在
    [转]Python函数的各种参数用法(含星号参数)
  • 原文地址:https://www.cnblogs.com/Roy_88/p/5463077.html
Copyright © 2020-2023  润新知