在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操作,寥寥几句就解决了。

时间: 2024-09-28 16:50:01

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

如何在SQL server 2005中将数据库备份路径设为网络路径

server|备份|数据|数据库|网络 如何在SQL server 2005中将数据库备份路径设为网络路径如:"\\BackupPC\dbback\" SQL server 2000中是可以的呀,怎么到2005就不好这样做的???=================================现在备份数据库真麻烦,都要先备份到本机,然后再剪切到网上邻居的另一台电脑中,真郁闷!!!! ===================================================

如何使用XML向SQL Server 2005批量写入数据:关于XML时间格式

常常遇到需要向SQL Server插入批量数据,然后在存储过程中对这些数据进行进一步处理的情况.存储过程并没有数组.列表之类的参数类型,使用XML类型可妥善解决这个问题. 不过,SQL Server2005对标准xml的支持不足,很多地方需要特别处理.举一个例子说明一下. 这个场景是往存储过程里传递一个xml序列化了的List<Model>. 1.Model的代码如下,这是一个实体类 public class Model { /// <summary> /// UIN /// &l

SQL Server把某个字段的数据用一条语句转换成字符串_MsSql

例如数据 列Name 复制代码 代码如下: name a b c d 最后的结果 复制代码 代码如下: a*b*c*d* declare @test table( namevarchar(10))  insert into @testvalues('a'),('b'),('c'),('d');                               select distinct (select cast(name asvarchar(2))+'*'from @test for xml pa

SQL Server把某个字段的数据用一条语句转换成字符串

例如数据 列Name 复制代码 代码如下: name a b c d 最后的结果 复制代码 代码如下: a*b*c*d* declare @test table( namevarchar(10))  insert into @testvalues('a'),('b'),('c'),('d');                               select distinct (select cast(name asvarchar(2))+'*'from @test for xml pa

.Net中将图片数据保存到XML文档

xml|数据 因为最近要做的项目中,我要通过XML动态生成窗体,看了UI图样,我有些叫苦:我通过XML动态生成窗体,可是主窗体中UI要用图标来确定要使用的窗体,怎么才能使主窗体的图标也是动态加载而且图标和要生成的窗体还有关联呢?我又想到用XML,查MSDN,看到只有XmlTextWriter和XmlTextReader里分别有XmlTextWriter.WriteBase64和XmlTextReader.ReadBase64可以操作图片这种二进制字节的数据.但是XmlTextWriter和Xml

SQL Server 2005新特性

一.企业级数据管理 在当今的互联世界中,数据和管理数据的系统必须始终为用户可用且能够确保安全,有了SQL Server 2005,组织内的用户和IT专家将从减少应用程序宕机时间.提高可伸缩性及性能.更紧密的安全控制中获益.SQL Server 2005 也包括了很多新的和改进的功能来帮助企业的IT团队更有效率的工作.SQL Server 2005 包括了几个在企业级数据管理中关键的增强: 易管理 可用性 可伸缩性 安全性 1.易管理 SQL Server 2005 能够更为简单的部署.管理和优化

Microsoft SQL Server 2005 中的 XML 支持(1)

本文探讨 SQL Server 2005 中内置的 XML 支持.描述了这种支持如何与 .NET 框架 V2.0 和本机代码(例如 OLEDB 和 SQLXML)均支持的客户端编程相集成. 一.简介 可扩展标记语言 (XML) 作为一种与平台无关的数据表示形式已被广泛采用.它对于在松散耦合且完全不同的系统,以及各种企业到企业 (B2B) 应用和工作流范畴内交换信息是很有用的.数据交换已成为 XML 技术的主要驱动力之一.. XML 在企业应用程序中的使用正日益广泛,它主要用于对半结构化和非结构化

SQL Server 2005中的DDL触发器的实现

server|触发器     SQL SERVER 2005中,新增加了许多新的特性,其中的DDL触发器是个不错的选择,根据资料初步学习如下,现整理之:    在sql server 2000中,只能为针对表发出的 DML 语句(INSERT.UPDATE 和 DELETE)定义 AFTER 触发器.SQL Server 2005 可以就整个服务器或数据库的某个范围为 DDL 事件定义触发器.可以为单个 DDL 语句(例如,CREATE_TABLE)或者为一组语句(例如,DDL_DATABASE

SQL Server 2005中DDL触发器的实现

SQL SERVER 2005中,新增加了许多新的特性,其中的DDL触发器是个不错的选择,根据资料初步学习如下,现整理之. 在sql server 2000中,只能为针对表发出的 DML 语句(INSERT.UPDATE 和 DELETE)定义 AFTER 触发器.SQL Server 2005 可以就整个服务器或数据库的某个范围为 DDL 事件定义触发器. 可以为单个 DDL 语句(例如,CREATE_TABLE)或者为一组语句(例如,DDL_DATABASE_LEVEL_EVENTS)定义