专栏首页跟着阿笨一起玩NET在Sql Server 2005中将主子表关系的XML文档转换成主子表“Join”形式的表

在Sql Server 2005中将主子表关系的XML文档转换成主子表“Join”形式的表

本文转载:http://www.cnblogs.com/Ricky81317/archive/2010/01/06/1640434.html

最近这段时间在Sql Server 2005下做了很多根据复杂XML文档导入数据表,以及根据数据表生成复杂XML文档的事情(并非 For XML Auto了事),所有的操作都是利用Sql语句,发现Sql Server 2005的XML文档处理能力真的已经很强了,自己也终于开始体会到Sql Server 2005真正的实力了。在这里记录一下这种情况的处理:

有以下一个XML文档:

<basevendors>
    <basevendor name="Northeast" taxid="99999" description="Re/Max Northeast" activevendor="Y" apvendornumber="8888">
        <basevendorcontactinfo>
            <basevendoraddress addressline1="2940 Oak St." City="Kingwood" statecode="TX" zip="77339" country="USA" effectivedate="11/11/2001" />
            <basevendoraddress addressline1="1849 Kingwood Dr." City="Kingwood" statecode="TX" zip="0" country="USA" />
        </basevendorcontactinfo>
    </basevendor>
    <basevendor name="Better Homes &amp; Gardens Rand Realty" taxid="321456" description="Better Homes &amp; Gardens Rand Realty" activevendor="Y" apvendornumber="87542">
        <basevendorcontactinfo>
            <basevendoraddress addressline1="10 Schriever Lane" City="New City" statecode="NY" zip="10956" country="USA" effectivedate="11/22/1899" />
        </basevendorcontactinfo>
    </basevendor>
    <basevendor name="Bodell-Van Drimmelen" taxid="9856587" description="Bodell-Van Drimmelen" activevendor="N" apvendornumber="22545">
        <basevendorcontactinfo>
            <basevendoraddress addressline1="Residential Appraisers, Inc." City="Salt Lake City" statecode="UT" zip="84106" country="USA" effectivedate="04/29/2003"/>
            <basevendoraddress addressline1="Residential Appraisers, Inc." City="Salt Lake City" statecode="UT" zip="0" country="USA" effectivedate="04/11/2003" />
        </basevendorcontactinfo>
    </basevendor>
    <basevendor name="Rental Relocation Inc." taxid="6589654" description="Rental Relocation Inc." activevendor="Y" apvendornumber="778855" />
</basevendors>

其中包含主子表关系,主表是basevendor节点的信息,包括name, taxid等内容,子表信息包含在每个basevendor节点下的basevendoraddress节点的属性中,包括addressline1, city等信息。

现在假设有这样一个数据表:

CREATE TABLE BaseVendorAndAddress
(
    BaseVendorName VARCHAR(50)
    , BaseVendorTaxId VARCHAR(20)
    , AddressLine VARCHAR(100)
    , City VARCHAR(20)
)

其中前2个字段来自于主表,而后面2个字段来自于子表

如何操作呢?Sql Server 2005太强大了(各位高手请勿蔑视小生这种“没见过世面”的夸张),以下是处理方法:

DECLARE @XML XML
SET @XML= '
<basevendors>
    ... 上面那段XML文档 ...
</basevendors>'
SELECT Vendor.value('@name[1]','varchar(50)') AS VendorName, Vendor.value('@taxid[1]','varchar(50)') AS TaxID
    , addr.value('@addressline1[1]','varchar(200)') AS AddressLine, addr.value('@City[1]','varchar(10)') AS City
FROM @XML.nodes('basevendors/basevendor') BV(Vendor)
CROSS APPLY BV.Vendor.nodes('basevendorcontactinfo/basevendoraddress') addrs(addr)

利用Sql Server 2005处理XML类型的能力和Apply操作,寥寥几句就解决了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • axios不支持finally的解决办法

    当我们执行一个promise操作时,往往伴随的是要做各种状态的修改(如请求开始时显示loading,结束时隐藏 loading), 这个状态修改,如果没有fin...

    跟着阿笨一起玩NET
  • ASP.NET WebApi服务接口如何防止重复请求实现HTTP幂等性

    跟着阿笨一起玩NET
  • sql语句延时执行或者是指定时间执行

    以下示例在晚上 10:20 (22:20) 执行存储过程 sp_update_job。

    跟着阿笨一起玩NET
  • 25-列表实现斐波那契数列

    凯茜的老爸
  • 从最简单的斐波那契数列来学习动态规划

    斐波那契数列是一个很经典的问题,虽然它很简单,但是在优化求解它的时候可以延伸出很多实用的优化算法。

    ssh1995
  • 33-函数应用-斐波那契数列

    凯茜的老爸
  • 记忆(缓存)函数返回值:Python

    对于经常调用的函数,特别是递归函数或计算密集的函数,记忆(缓存)返回值可以显着提高性能。而在 Python 里,可以使用字典来完成。

    py3study
  • Linux shell 实现HTTP服务

    需求场景 使用代理服务器 HAProxy 对 Mysql 做负载均衡是常用方案,为提高可用性,当某个 Mysql 出现问题时,例如服务器故障了,或者数据复制中断...

    dys
  • python - 斐波那契(Fibona

    py3study
  • 【DB笔试面试542】简述Oracle中的密码文件。

    Oracle密码文件的作用主要是进行SYSDBA和SYSOPER权限的身份认证。密码文件存放着被授予SYSDBA或SYSOPER权限的用户的用户名和密码。它是一...

    小麦苗DBA宝典

扫码关注云+社区

领取腾讯云代金券