T-SQL之操作XML

时间:2022-02-16 01:28:12

 

  • 综述
  •       MSSQL2005引入了XML的数据类型,相应的T-SQL也提供了大量的语句和函数用于支持对XML的操作,以及维护关系型数据和XML之间的转换。
     
  • 对XML查询
  •       T-SQL提供了以下几个针对 XML类型的查询函数:
          query(XQuery):利用 Xquery查询符合条件的元素集合。
          value(XQuery,Type):利用 Xquery查询具体元素的值, Type定义值的类型。
          exist(XQuery):利用 Xquery查询是否存在符合条件的元素。
          nodes(XQuery):利用 Xquery获得一个结果集。
     
          下面是详细的示例:
      
    T-SQL之操作XMLT-SQL之操作XML查询XML
         
         
         
    1    DECLARE @Doc xml
    2   SET @Doc = ' <Books><Book ID="10001"><Name>CLR VIA C#</Name></Book><Book ID="10002"><Name>.net高级调试</Name></Book></Books> '
    3   SELECT @Doc
    4
    5   -- 获取有ID属性的Book元素
    6   SELECT @Doc .query( ' Books/Book[@ID] ' )
    7
    8   -- 获取第个Name元素的值
    9   SELECT @Doc .value( ' (Books/Book/Name)[2] ' , ' nvarchar(128) ' )
    10
    11   -- 是否存在ID=10003的Book元素
    12   SELECT @Doc .exist( ' Books/Book[@ID=10003] ' )
    13
    14   -- 从一个由Book元素组成的结果集中获取所有Name元素
    15   SELECT T.x.query( ' Name ' ) FROM @Doc .nodes( ' Books/Book ' ) as T(x)
    16
    17   GO
      
    T-SQL之操作XML
       
  • 修改XML
  •       XML的修改操作包括对元素及其属性和值的增加、修改、删除。 T-SQL提供 modify函数以实现对 XML的修改操作。
          SET modify( ' insert "" before XQuery ' ):在符合 Xquery条件的元素之前插入元素。
          SET modify( ' insert attribute "" into XQuery ' ): 在符合 Xquery条件的元素中插入属性。
          SET modify( ' replace value of XQuery with ""' ):修改符合 Xquery条件的元素内容。
          SET modify( ' delete XQuery ' ):删除符合 Xquery条件的元素内容。
     
          下面是详细的示例:
     
    T-SQL之操作XMLT-SQL之操作XML修改XML
        
        
        
    1    DECLARE @Doc xml
    2   SET @Doc = ' <Books><Book ID="10001"><Name>CLR VIA C#</Name></Book><Book ID="10002"><Name>.net高级调试</Name></Book></Books> '
    3   SELECT @Doc
    4
    5   -- 增加个Book元素
    6   SET @Doc .modify( ' insert <Book ID="10003"><Name>WF本质论</Name></Book> before (Books/Book[@ID])[2] ' )
    7   SELECT @Doc
    8
    9   -- 修改ID=10003的Book元素下Name元素的值
    10   SET @Doc .modify( ' replace value of (Books/Book[@ID=10003]/Name/text())[1] with "WCF揭秘" ' )
    11   SELECT @Doc
    12
    13   -- 删除ID=10003的Book元素
    14   SET @Doc .modify( ' delete Books/Book[@ID=10003] ' )
    15   SELECT @Doc
    16
    17   -- 第个ID=10001的Book元素增加个属性
    18   SET @Doc .modify( ' insert attribute Author{"Mario Hewardt"} into (Books/Book[@ID=10001])[1] ' )
    19    SELECT @Doc
    20
    21    -- 修改第个ID=10001的Book元素的Author属性
    22    SET @Doc .modify( ' replace value of (Books/Book[@ID=10001]/@Author)[1] with "Jeffrey Richter" ' )
    23    SELECT @Doc
    24
    25    -- 删除第个ID=10001的Book元素的Author属性
    26    SET @Doc .modify( ' delete Books/Book[@ID=10001]/@Author ' )
    27    SELECT @Doc
    28
    29    GO
     
    T-SQL之操作XML
     
  • 返回XML
  •       T-SQL利用 FOR XML语句将 SELECT语句返回的行聚合成 XMLMSSQL支持以下四种模式: RAWAUTOPATH EXPLICIT,下面只讨论前三个模式。
          FOR XML AUTO [,ELEMENTS] [,ROOT( '' )]:表名定义成每条记录的元素名,字段名默认定义成属性,也可以设置成元素。
          FOR XML RAW( '' ) [,ELEMENTS] [,ROOT( '' )]:按 RAW定义每条记录的元素名,字段名默认定义成属性,也可以设置成元素。
          FOR XML PATH( '' ) [,ROOT( '' )]:按 PATH定义具体的 XML结构。
          FOR XML语句可以配合字段别名一起定义生成的 XML结构。具体可以参考下面的示例。
     
    T-SQL之操作XMLT-SQL之操作XML返回XML
          
          
          
    1 -- 测试表和测试数据
    2   CREATE TABLE [ dbo ] . [ Books ] (
    3 [ ID ] [ bigint ] NOT NULL ,
    4 [ Name ] [ nvarchar ] ( 128 ) NOT NULL
    5 ) ON [ PRIMARY ]
    6   GO
    7
    8   INSERT INTO [ dbo ] . [ Books ]
    9   VALUES
    10 ( 10001 , ' CLR VIA C# ' ),
    11 ( 10002 , ' .net高级调试 ' )
    12 GO
    13
    14 -- 示例
    15 SELECT ID,NAME FROM [ dbo ] . [ Books ]
    16
    17 SELECT ID,NAME FROM [ dbo ] . [ Books ]
    18 FOR XML AUTO
    19
    20 SELECT ID,NAME FROM [ dbo ] . [ Books ]
    21 FOR XML AUTO ,ELEMENTS ,ROOT( ' Books ' )
    22
    23 SELECT ID as ' BookID ' ,NAME as ' BookName ' FROM [ dbo ] . [ Books ]
    24 FOR XML RAW
    25
    26 SELECT ID,NAME FROM [ dbo ] . [ Books ]
    27 FOR XML RAW ( ' Book ' ) ,ELEMENTS ,ROOT( ' Books ' )
    28
    29 SELECT ID,NAME FROM [ dbo ] . [ Books ]
    30 FOR XML PATH( '' )
    31
    32 SELECT ID as ' Detail/@ID ' ,NAME as ' Detail/Name ' FROM [ dbo ] . [ Books ]
    33 FOR XML PATH( ' Book ' ), ROOT( ' Books ' )
    34
    35 GO
     
    T-SQL之操作XML
     
          需要特别声明一下,FOR XML PATH语句可以用来方便的实现列合并。
          比如要对上面的Book表合并Name字段,以“;”分隔每项:
     
         
         
         
    1 SELECT STUFF (( SELECT ' ; ' + Name FROM [ dbo ] . [ Books ] FOR XML PATH( '' ))
    2 , 1 , 1 , '' )
     
    T-SQL之操作XML