XML在SQL Server中的应用
- 格式:pdf
- 大小:812.08 KB
- 文档页数:3
SQL Server中的FOR XML PATH语句允许用户将查询结果以XML格式返回。
通过使用FOR XML PATH,用户可以在SQL Server中将查询结果转换为符合XML标准的格式,便于数据交换和处理。
本文将介绍SQL Server中FOR XML PATH语句的基本用法和实际应用场景。
一、FOR XML PATH的基本用法1. FOR XML PATH语句的基本语法在SQL Server中,用户可以通过以下语法将查询结果转换为XML格式:SELECT column1, column2, ...FROM tableFOR XML PATH('root'), ROOT('root')其中,SELECT语句用于选择需要转换为XML的列,而FOR XML PATH('root')语句用于将查询结果放置在一个名为'root'的节点中。
在ROOT('root')中,用户还可以指定XML文档的根节点名称。
2. 使用FOR XML PATH进行简单的XML格式转换接下来,我们通过一个简单的示例来演示FOR XML PATH的基本用法。
假设我们有一个名为'Employee'的表,该表包含两个字段'Name'和'Age',我们希望将查询结果以XML格式返回。
我们可以通过以下SELECT语句选择需要转换为XML格式的字段:SELECT Name, AgeFROM EmployeeFOR XML PATH('Employee'), ROOT('Employees')通过运行以上SQL语句,我们可以得到如下的XML格式结果:<Employees><Employee><Name>John</Name><Age>30</Age></Employee><Employee><Name>Emma</Name><Age>25</Age></Employee>...</Employees>二、FOR XML PATH的高级用法除了基本用法外,FOR XML PATH还可以通过一些高级技巧实现更加灵活和复杂的XML格式转换。
SQL对Xml字段的操作T-Sql操作Xml数据一、前言SQL Server 2005 引入了一种称为XML 的本机数据类型。
用户可以创建这样的表,它在关系列之外还有一个或多个XML 类型的列;此外,还允许带有变量和参数。
为了更好地支持XML 模型特征(例如文档顺序和递归结构),XML 值以内部格式存储为大型二进制对象(BLOB)。
用户将一个XML数据存入数据库的时候,可以使用这个XML的字符串,SQL Server会自动的将这个字符串转化为XML类型,并存储到数据库中。
随着SQL Server 对XML字段的支持,相应的,T-SQL语句也提供了大量对XML操作的功能来配合SQL Server中XML字段的使用。
本文主要说明如何使用SQL语句对XML进行操作。
二、定义XML字段在进行数据库的设计中,我们可以在表设计器中,很方便的将一个字段定义为XML类型。
需要注意的是,XML字段不能用来作为主键或者索引键。
同样,我们也可以使用SQL语句来创建使用XML字段的数据表,下面的语句创建一个名为“docs”的表,该表带有整型主键“pk”和非类型化的XML 列“xCol”:CREATE TABLE docs (pk INT PRIMARY KEY, xCol XML not null)XML类型除了在表中使用,还可以在存储过程、事务、函数等中出现。
下面我们来完成我们对XML操作的第一步,使用SQL语句定义一个XML类型的数据,并为它赋值:declare @xmlDoc xml;set @xmlDoc='<book id="0001"><title>C Program</title><author>David</author><price>21</price></book>'三、查询操作在定义了一个XML类型的数据之后,我们最常用的就是查询操作,下面我们来介绍如何使用SQL 语句来进行查询操作的。
使⽤XML对SQLSERVER数据库中数据进⾏批量修改Bulk update the datas of SQL SERVER(2005 OR 2008) using XMLwhen we update data ,we firstly use the Class of StringBuilder to build the string of XML:StringBuilder builder=new StringBuilder();builder.Append("<root>");builder.AppendFormat("<ID>{0}</ID>",ID.Text);builder.AppendFormat("<dataName>{0}</dataName>",dataName.Text);builder.AppendFormat("<UseName>{0}</UseName>",UseName.Text);builder.Append("</root>");Secondly,we create procedure in SQL :set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgocreate PROCEDURE [dbo].[Update....](@XMLCustomer XML)ASBEGINUPDATE CustomerSET CustName=TempCustomer.Item.value(, 'VARCHAR(50)'),CustState=TempCustomer.Item.value(, 'VARCHAR(50)')FROM @XMLCustomer.nodes('/root/row') AS TempCustomer(Item)WHERE ID=TempCustomer.Item.value(, 'INT')RETURN 0ENDThirdly:T_SQL FOR Operate SQL DataBase................Test:declare @data xmlset @data='<Tags><Tag><HouseID>13c099d2-1378-41cd-8266-22537efe0ff3</HouseID></Tag><Tag><HouseID>2AB284E4-9315-4AE5-B325-AF09AE423320</HouseID></Tag><Tag><HouseID>D1B3BB46-DD65-4830-85E9-6CB87108B2EF</HouseID></Tag> </Tags>'--修改House表的ISEnable为0SELECTT.V.value('HouseID[1]','UNIQUEIDENTIFIER') as HouseIDINTO #TagsReportFROM @data.nodes('//Tags/Tag') AS T(V)UPDATE dbo.tb_HCS_HouseSET ISEnable=0from dbo.tb_HCS_House tb_hleft join #TagsReport as rep on rep.HouseID=tb_h.HouseIDWHERE rep.HouseID is not nullDROP TABLE #TagsReport。
XML和SQL Server集成创建XML数据类型变量
作为SQL Server 2005系统中的一种基本数据类型,同样可以像使用其他基本数据类型来定义一个变量那样,定义一个基于XML数据类型的变量。
与声明其他类
其中除variable_name用于表示变量名之外,其他参数的含义与上一节中介绍的创建数据表时使用的参数是一致的。
下面通过示例说明XML类型变量的使用方法,单击【新建查询】按钮,在【查
上述Transact-SQL脚本中声明了一个名为@CategoryInfo的XML型变量,并使用SET命令对该变量进行赋值。
然后再通过该变量向数据表xml_Categories中插入一条记录。
单击【执行】按钮,执行上述Transact-SQL脚本,向数据库xml_Categories中插入一条记录,如图6-4所示。
图6-4 执行结果
继续在【查询编辑器】中输入下面的Transact SQL脚本,将上述脚本中的</CategoryName>更改为</categoryname>会出现什么样的情况呢?单击【执行】按
钮,【查询编辑器】将报告如图6-5所示的错误。
图6-5 执行结果
由此可见,XML的确是区分大小写的,因此在输入XML类型的数据时,一定要注意标签的大小写一定要统一。
而在Transact-SQL中,所有的变量都是不区分大
小写的。
因此在Transact-SQL中编写带有XML元素的脚本时应该注意两者的区别。
从SQLServer中读取XML⽂件SQL Server 2000使得以XML导出数据变得更加简单,但在SQL Server 2000中导⼊XML数据并对其进⾏处理则有些⿇烦。
如果你参考Books Online(BOL),你会发现有相关的条⽬,包括OPENXML以及 OPENROWSET。
所有的这些例⼦都⽀持将XML⽂本作为已经声明的变量,这对于经常处理⽂本的⽤户来说⾮常⽅便,但对于希望在开发中读取XML⽂件并进⾏相应处理的开发⼈员来说就不是这样了。
处理这样的问题,或许最好从内到外来对其进⾏分析。
OPENXML是⼀个rowset函数(即返回⼀个rowset),它的⼯作⽅式类似于rowset函数OPENQUERY和OPENROWSET。
使⽤OPENXML 可以对XML数据执⾏JOINs操作⽽⽆需⾸先导⼊数据。
你还可以将其同INSERT、SELECT、UPDATE以及DELETE等操作联合使⽤。
然⽽,要使⽤OPENXML,你必须执⾏两项OPENQUERY和OPENROWSET并不需要的任务。
这两项任务需要两个系统存储进程。
第⼀个是sp_xml_preparedocument,它将读取特定的XML⽂本并将其内容提取到内存中。
其语法如下:sp_xml_preparedocument @hdoc = OUTPUT,[, @xmltext = ][, @xpath_namespaces =具体参数如下:@hdoc:指向某内存区域的句柄(从作⽤上看等同于⼀个指针),相关数据存放在这⾥。
注意这是⼀个输出变量,当该进程运⾏后,该变量将包含指向XML⽂件内容在内存地址的句柄。
由于你需要在随后使⽤此结果,因此要确保对其进⾏保存;@xmltext:实际上你所希望处理的XML⽂本;@xml_namespaces:为了正常操作你的XML数据所需要的任何名字空间索引(namespace references)。
注意在这⾥出现的任何URL都需要⽤尖括号(<>)括起来;假设所传递的这些参数都有效,并且XML⽂档存在,那么你的XML数据就会被存放到内存中去。
图5-41 使用query方法方法指示一个查询是否返回结果,如果一个查询存在返回结果,0.使用exist方法的语法格式为:例如下面的语句使用了query方法和exist方法:商品信息xml5-42 exist方法方法后,查询的返回结果将是一个标量,其语法格式为:Value(XQuery,SQLType)方法有两个参数:一个是XQuery语句,另一个参数是需要返回的数据类方法可以返回除了XML数据类型外的任何数据类型。
例如下面语句使用value方法返回XML节点中的属性值:商品信息xmlint图5-44 使用modify方法方法方法十分有用,它可以将XML数据类型实例拆分为关系数据,允许用户标识映射到新行的节点。
Nodes方法的结果是一个包含原始XML实例的逻辑副本的行集。
在这些逻辑副本中,每个行示例的上下文节点都被设置成由查询表达式标识的节点之一。
这样,后续的查询可以浏览与这些上下文节点相关的节点。
(XQuery) as Table (Column)图5-45 使用nodes方法For XML子句XML子句并指定模式可以将从数据库系统的表中检索出来的数据自格式。
SQL SERVER 2008在其中增加了FOR XML添加了多种显示模式,如RAW模式、AUTO模式、EXPLICIT模式和模式将查询结果表中每一行作为一个XML元素,并以row图5-46 使用RAW模式从返回结果中可以看到,使用FOR XML RAW后将所有查询结果以式输出,并放置在一行中,这样很难看清结果集的具体内容,此时用户可以单击结系统会弹出一个完整的窗口显示结果集的XML格式,图5-47 结果集的XML格式模式也是有缺点的,它缺乏一般XML应有的层次特征,RAW生的结果很少直接作为数据交换的格式,而必须进行进一步的处理。
但这种后处理的过程往往抵消了本身查询的高效性,成了影响系统性能的一个重要因素。
因此子句中还提供了其他形式。
模式图5-48 使用AUTO模式用户无法在一行中完整地看出返回结果的XML层次结构,单击该返回结果蓝色部分,在另一个窗口中会显示出完全的内容,如图5-49所示。
SQLSERVER2005中的XML1创建XML字段表1.创建shcema,注册到SQLServer2005的XMl Schema Collections中CREATE XML SCHEMA COLLECTION SchemaCol'<xsd:schema xmlns="..."> ... schema content ...</xsd:schema>'2.建表语法:CREATE TABLE XMLTest(ID int, xmlcontent xml(SchemaCol))2插入数据1.直接字符串Insert into xmltest(xmlcontent)Values(‘<Root> AAAa</Root>’)2.使用OPENROWSET从文件中加载INSERT INTO xmltest (xmlcontent)SELECT*FROM OPENROWSET(BULK'C:\DOC.xml', SINGLE_NCLOB)3.通过For XML转换数据表DECLARE@xmlDoc XMLSET@xmlDoc=(Select编码,名称from部门基本信息For XML AUTO,ROOT ('ZLSOFT'), ELEMENTS )INSERT INTO xmltest (xmlcontent) Values(@xmlDoc)3XML列转换通过CAST和Convert进行转换通过CASTINSERT INTO xmltest(xmlcontent)VALUES (CAST(‘<Root> AAAa</Root>’) AS xml))●通过CONVERTINSERT INTO xmltest (xmlcontent)VALUES (1, CONVERT(xml, ‘<Root> AAAa</Root>’))●转换成Char类型SELECT CONVERT(NVARCHAR(MAX), xmlcontent)FROM xmltest4节点查询1.通过Query查询(等同于Oracle 的ExtractValue和XMLQuery)●一般查询SELECT xmlcontent.query('/ZLSOFT/ProcessList/Title')From xmltest返回值为:<Title>输出文件</Title>●加上Data函数,去掉节点标记SELECT xmlcontent.query('data(/ZLSOFT/ProcessList[1]/Title)')From xmltest返回值为:输出文件●加上命名空间SELECT xmlcontent.query('declare namespace s="http://microsoft/office2007";/ZLSOFT/ProcessList/Title ') FROM xmltest2.通过Value查询(等同于Oracle的XMLCast,只允许单个返回值)SELECTxmlcontent.value('(/ZLSOFT/ProcessList/Title)[1]','nvarchar(MAX)' )From xmltest3.通过exist进行组合查询(等同于Oracle的ExistsNodes)SELECT xmlcontent.query('data(/ZLSOFT/ProcessList[1]/Title)') FROM xmltestWHERE xmlcontent.exist('/ZLSOFT/ProcessList/Title') = 14.使用nodes函数(等同于oracle 的XMLTable函数)用于将xml数据类型实例拆分为关系数据,标识将映射到新行的节点。
XML和SQL Server集成创建和管理XML索引前面已经介绍过,XML数据类型以二进制大对象的格式保存于XML数据类型的字段中,因此在查询这些字段时,SQL Server 2008需要在运行时刻对数据表中的每条记录进行细化,将一个XML数据类型字段中存放的XML文档转换到关系数据库中的每张数据表中,以便对其中的信息进行查询。
显然完成这一操作必然会加重SQL Server系统的负担,降低整个查询工作的效率。
因此为了提高对XML字段进行查询的效率,建议为XML类型的字段建立XML索引。
像其他大多数数据类型的字段一样,用户也可在XML字段上创建一个XML 索引,创建XML索引的语法与创建标准索引的语法相同。
XML类型的索引分为两种,即主索引(primary XML index)和辅助索引(secondary XML index)。
其中辅助索引必须建立于主索引的基础之上。
XML主索引建立于XML字段中XML文档里的所有标签和路径之上,因此为XML数据类型的字段创建一个主索引时,该主索引必定是一个簇索引。
而辅助索引又可分为三种类型,如表6-2所示。
表6-2 辅助索引类型创建XML索引的语法如下所示:其中相关参数的含义如表6-3所示。
表6-3 相关参数的含义中包含许多参数,例如可以在创建一个XML索引时指定DROP_EXISTING = { ON | OFF}选项,当该选项被设置为ON时,创建该索引前会判断是否已存在同名的索引,如果存在就先将它删除。
关于创建XML索引时可以使用的其他选项信息,读者可以查看Microsoft提供的联机帮助文档。
下面为数据表xml_Categories创建一个XML索引。
在【查询编辑器】中输入下面的Transact-SQL脚本。
单击【执行】按钮,创建该索引,如图6-6所示。
图6-6 创建索引用户可以通过SQL Server提供的系统视图sys.indexes来查看是否已成功地创建索引,其结果如图6-7所示。
SQL Server XML语法是指在使用SQL Server数据库时,对XML文档进行操作时所需的语法规则。
XML(可扩展标记语言)是一种用于传输和存储数据的标记语言,它具有可读性强、结构清晰的特点,所以在数据库中存储和操作XML数据是非常常见的需求。
SQL Server提供了丰富的XML功能,包括生成XML、将关系数据转换为XML、将XML数据转换为关系数据等,开发人员可以使用SQL Server XML语法轻松地实现这些功能。
下面将分别介绍SQL Server XML语法中常用的一些功能及其用法。
1. 生成XML在SQL Server中,可以使用FOR XML子句生成XML文档。
FOR XML子句可以与SELECT语句一起使用,将查询结果转换为XML格式。
例如:```sqlSELECT * FROM table_name FOR XML AUTO```上述语句将查询结果以AUTO模式转换为XML格式。
还可以使用RAW、EXPLICIT、PATH等模式生成不同格式的XML文档。
开发人员可以根据实际需求选择合适的模式来生成XML文档。
2. 将关系数据转换为XML除了使用FOR XML子句将查询结果转换为XML格式外,还可以使用XML DATA TYPE类型将关系数据转换为XML格式。
XML DATA TYPE类型是SQL Server中的一种特殊数据类型,用于存储XML数据。
例如:```sqlDECLARE xml_data XMLSET xml_data = (SELECT * FROM table_name FOR XML AUTO) ```上述语句将查询结果以AUTO模式转换为XML格式,并将结果存储到XML类型的变量xml_data中。
通过XML类型的变量,开发人员可以轻松地对XML数据进行操作。
3. 将XML数据转换为关系数据除了将关系数据转换为XML格式外,还可以使用OPENXML函数将XML数据转换为关系数据。
sql server 数组类型
SQL Server是一个关系型数据库管理系统,其中最重要的数据类型之一是表(table)。
在SQL Server中,表由行和列组成,每一列都具有相同的数据类型。
数组是一种数据结构,它允许我们在一个变量中存储多个值,这些值可以是相同的数据类型或不同的数据类型。
在SQL Server中,我们可以使用数组来组织和存储数据。
在SQL Server中,有两种主要的数组类型:
1. 表值函数返回的行集
表值函数是一种特殊的函数,它允许我们返回一行或多行数据。
我们可以使用表值函数返回一个包含多个列的行集,这个行集可以看作是一个二维数组。
我们可以使用SELECT语句查询这个行集,并使用JOIN语句连接多个表值函数。
2. XML类型
XML是一种通用的标记语言,它可以用于表示和存储各种类型的数据。
在SQL Server中,我们可以使用XML类型来存储和组织数据。
XML类型的本质是一个树形结构,这个树形结构中的每个节点都可以包含多个值,这些值可以是相同的数据类型或不同的数据类型。
我们可以使用FOR XML PATH语句将表中的数据转换为XML类型,并使用FOR XML AUTO语句将XML类型的数据转换回表格式。
使用数组类型可以方便地组织和存储数据,同时也可以提高查询效率。
在SQL Server中,我们可以使用数组类型来处理大量数据,同时也可以使用数组类型来加快查询速度。
sql xml解析XML(可扩展标记语言)是一种用于存储和交换数据的语言。
SQL (结构化查询语言)是一种用于管理关系数据库管理系统(RDBMS)的编程语言。
在关系数据库管理系统中,可以将XML文档存储为文本列,并可以使用SQL查询语句来解析XML数据。
本文将介绍如何使用SQL解析XML数据以及一些有用的XML解析函数。
1. SQL中的XML数据类型在SQL Server中,可以使用XML作为数据类型来存储XML数据。
XML数据类型被定义为用于存储XML文档的数据类型。
当使用XML数据类型存储XML值时,可以使用XML文档中的关系数据来查询整个文档或基于元素的查询。
下面是SQL Server中的XML数据类型的定义:XML [ (n) ]其中,n是可选参数,用于指定XML数据类型的最大大小(以字节为单位)。
2.使用OPENXML解析XML数据OPENXML是SQL Server中的一个内置函数,用于解析XML数据。
使用OPENXML可以将XML文档转换为关系表,并使用SQL查询语言访问数据。
下面是使用OPENXML解析XML数据的一般步骤:步骤1:创建XML文档的表结构。
在创建XML文档之前,需要定义一个表来存储XML文档中的数据。
该表应包含与XML文档元素和属性相对应的列。
步骤2:使用OPENXML将XML数据转换为关系表。
使用OPENXML可以将XML文档转换为关系表。
OPENXML函数需要三个参数:XML文档的标识符,表示文档中节点的XPath表达式,以及一个指示节点的ID的列名。
步骤3:使用T-SQL查询解析XML文档。
一旦将XML文档转换为关系表,就可以使用SQL查询语言来访问数据。
可以使用SELECT语句选择特定的列并应用任何必要的过滤条件。
下面是使用OPENXML解析XML文档的示例:DECLARE @xml XMLSET @xml = N'<employees><employee id="1" fullname="John Smith"><department>Accounting</department><hiredate>2000-01-01</hiredate><salary>50000</salary></employee><employee id="2" fullname="Jane Doe"><department>Human Resources</department><hiredate>2001-01-01</hiredate><salary>60000</salary></employee></employees>'-- Define table structure to store XML data CREATE TABLE #Employees(ID INT IDENTITY(1, 1),EmployeeID INT,FullName VARCHAR(100),Department VARCHAR(50),HireDate DATE,Salary DECIMAL(10, 2))-- Convert XML to relational tableINSERT INTO #Employees (EmployeeID, FullName, Department, HireDate, Salary)SELECTx.value('@id', 'int'), -- Get value of 'id' attributex.value('@fullname', 'varchar(100)'), -- Get value of'fullname' attributex.value('department[1]', 'varchar(50)'), -- Get value of'department' elementx.value('hiredate[1]', 'date'), -- Get value of'hiredate' elementx.value('salary[1]', 'decimal(10,2)') -- Get value of'salary' element**************('/employees/employee')ASt(x)-- Query the XML dataSELECT * FROM #Employees WHERE Salary > 55000-- Clean upDROP TABLE #Employees此示例将XML文档转换为关系表,然后使用T-SQL查询检索数据。
SQLServer中的XML数据进⾏insert、update、deleteSQL Server 2005/2008增加了对XML数据的⽀持,同时也新增了⼏种操作XML的⽅法,本⽂主要以SQL Server 2008为例介绍如何对XML数据进⾏insert、update、delete。
SQL Server中新增加了XML.Modify()⽅法,分别为xml.modify(insert),xml.modify(delete),xml.modify(replace)对应XML的插⼊,删除和修改操作。
本⽂以下⾯XML为例,对三种DML进⾏说明:declare @XMLVar XML;SET @XMLVar= '<catalog><book category="ITPro"><title>Windows Step By Step</title><author>Bill Zack</author><price>49.99</price></book><book category="Developer"><title>Developing ADO .NET</title><author>Andrew Brust</author><price>39.93</price></book><book category="ITPro"><title>Windows Cluster Server</title><author>Stephen Forte</author><price>59.99</price></book></catalog>'1.XML.Modify(Insert)语句介绍A.利⽤as first,at last,before,after四个参数将元素插⼊指定的位置set @XMLVar.modify('insert <first name="at first" /> as first into (/catalog[1]/book[1])')set @XMLVar.modify('insert <last name="at last"/> as last into (/catalog[1]/book[1])')set @XMLVar.modify('insert <before name="before"/> before (/catalog[1]/book[1]/author[1])')set @XMLVar.modify('insert <after name="after"/> after (/catalog[1]/book[1]/author[1])')SELECT @XMLVar.query('/catalog[1]/book[1]');结果集为:1: <book category="ITPro">2: <first name="at first" />3: <title>Windows Step By Step</title>4: <before name="before" />5: <author>Bill Zack</author>6: <after name="after" />7: <price>49.99</price>8: <last name="at last" />9: </book>B.将多个元素插⼊⽂档中--⽅法⼀:利⽤变量进⾏插⼊DECLARE @newFeatures xml;SET @newFeatures = N'; <first>one element</first> <second>second element</second>'SET @XMLVar.modify(' )insert sql:variable("@newFeatures")into (/catalog[1]/book[1])'--⽅法⼆:直接插⼊set @XMLVar.modify(')insert (<first>one element</first>,<second>second element</second>)into (/catalog[1]/book[1]/author[1])'SELECT @XMLVar.query('/catalog[1]/book[1]');结果集为:1: <book category="ITPro">2: <title>Windows Step By Step</title>3: <author>Bill Zack4: <first>one element</first>5: <second>second element</second>6: </author>7: <price>49.99</price>8: <first>one element</first>9: <second>second element</second>10: </book>C.将属性插⼊⽂档中--使⽤变量插⼊declare @var nvarchar(10) = '变量插⼊'set @XMLVar.modify('insert (attribute var {sql:variable("@var")}))into (/catalog[1]/book[1])'--直接插⼊set @XMLVar.modify('insert (attribute name {"直接插⼊"}))into (/catalog[1]/book[1]/title[1])'--多值插⼊set @XMLVar.modify('insert (attribute Id {"多值插⼊1"},attribute name {"多值插⼊2"}) )into (/catalog[1]/book[1]/author[1])'SELECT @XMLVar.query('/catalog[1]/book[1]');结果集为:1: <book category="ITPro" var="变量插⼊">2: <title name="直接插⼊">Windows Step By Step</title>3: <author Id="多值插⼊1" name="多值插⼊2">Bill Zack</author>4: <price>49.99</price>5: </book>D.插⼊⽂本节点set @XMLVar.modify('insert text{"at first"} as first)into (/catalog[1]/book[1])'SELECT @XMLVar.query('/catalog[1]/book[1]');结果集为:1: <book category="ITPro">2: at first3: <title>Windows Step By Step</title>4: <author>Bill Zack</author>5: <price>49.99</price>6: </book>注意:插⼊本⽂同样具体 as first,as last,before,after四种选项,可以参考A中的使⽤⽅法E.插⼊注释节点set @XMLVar.modify(N'insert <!--插⼊评论-->before (/catalog[1]/book[1]/title[1])' )SELECT @XMLVar.query('/catalog[1]/book[1]');结果集为:1: <book category="ITPro">2: <!--插⼊评论-->3: <title>Windows Step By Step</title>4: <author>Bill Zack</author>5: <price>49.99</price>6: </book>注意插⼊注释节点同样具体 as first,as last,before,after四种选项,可以参考A中的使⽤⽅法F.插⼊处理指令set @XMLVar.modify('insert <?Program "Instructions.exe" ?>before (/catalog[1]/book[1]/title[1])' )SELECT @XMLVar.query('/catalog[1]/book[1]');结果集为:1: <book category="ITPro">2: <?Program "Instructions.exe" ?>3: <title>Windows Step By Step</title>4: <author>Bill Zack</author>5: <price>49.99</price>6: </book>注意插⼊处理指令同样具体 as first,as last,before,after四种选项,可以参考A中的使⽤⽅法G.根据 if 条件语句进⾏插⼊set @XMLVar.modify('insertif (/catalog[1]/book[1]/title[2]) thentext{"this is a 1 step"}else ( text{"this is a 2 step"} )into (/catalog[1]/book[1]/price[1])' )SELECT @XMLVar.query('/catalog[1]/book[1]');结果集为:1: <book category="ITPro">2: <title>Windows Step By Step</title>3: <author>Bill Zack</author>4: <price>49.99this is a 2 step</price>5: </book>2.XML.Modify(delete)语句介绍--删除属性set @XMLVar.modify('delete /catalog[1]/book[1]/@category')--删除节点set @XMLVar.modify('delete /catalog[1]/book[1]/title[1]')--删除内容set @XMLVar.modify('delete /catalog[1]/book[1]/author[1]/text()')--全部删除set @XMLVar.modify('delete /catalog[1]/book[2]')SELECT @XMLVar.query('/catalog[1]');结果集为:1: <catalog>2: <book>3: <author />4: <price>49.99</price>5: </book>6: <book category="ITPro">7: <title>Windows Cluster Server</title>8: <author>Stephen Forte</author>9: <price>59.99</price>10: </book>11: </catalog>3.XML.Modify(replace)语句介绍--替换属性set @XMLVar.modify(N'replace value of(/catalog[1]/book[1]/@category)with ("替换属性")' )--替换内容set @XMLVar.modify(N'replace value of(/catalog[1]/book[1]/author[1]/text()[1]) with("替换内容")' )--条件替换set @XMLVar.modify(N'replace value of (/catalog[1]/book[2]/@category) with(if(count(/catalog[1]/book)>4) then"条件替换1"else"条件替换2")' )SELECT @XMLVar.query('/catalog[1]'); 结果集为:1: <catalog>2: <book category="替换属性">3: <title>Windows Step By Step</title>4: <author>替换内容</author>5: <price>49.99</price>6: </book>7: <book category="条件替换2">8: <title>Developing ADO .NET</title>9: <author>Andrew Brust</author>10: <price>39.93</price>11: </book>12: <book category="ITPro">13: <title>Windows Cluster Server</title>14: <author>Stephen Forte</author>15: <price>59.99</price>16: </book>17: </catalog>。
在 SQL Server 2008 中,可以使用 XML 查询条件来过滤和检索 XML 数据。
以下是一些常用的 XML 查询条件的示例:1.查询 XML 元素的值:SELECT XMLColumn.value('local-name(.)', 'nvarchar(100)') AS ElementNameFROM YourTableWHERE YourTable.XMLColumn.value('local-name(.)', 'nvarchar(100)') = 'ElementValue'上述查询将返回名为 "ElementName" 的 XML 元素值为 "ElementValue" 的所有行。
2.查询 XML 属性的值:SELECT XMLColumn.value('local-name(.)', 'nvarchar(100)') AS AttributeNameFROM YourTableWHERE YourTable.XMLColumn.value('local-name(.)', 'nvarchar(100)') = 'AttributeValue'上述查询将返回名为"AttributeName" 的XML 属性值为"AttributeValue" 的所有行。
3.使用路径表达式查询嵌套的 XML 元素:SELECT XMLColumn.value('(./Element1/Element2)[1]', 'nvarchar(100)') AS NestedElementValueFROM YourTableWHERE YourTable.XMLColumn.value('local-name(.)', 'nvarchar(100)') = 'Element1'上述查询将返回名为 "Element1" 的 XML 元素中名为 "Element2" 的子元素的值。
8.4.3 SQL Server 2008中XML应用Microsoft 在SQL Server 2000中就推出了与XML相关的功能,并Transact-SQL语言的有关命令中增加了关键字FOR XML和OPENXML,使开发人员可以通过编写Transact-SQL代码来获取XML流形式的查询结果,或者将XML文档格式的数据导入到数据库的基本表中。
SQL Server 2005 不仅扩展了这些关于支持XML的功能,而且推出了一个支持XSD schema验证、基于XQuery的操作和XML索引的本地XML数据类型。
SQL Server 2008在其之前版本支持XML功能的基础之上,做了许多新改进和补充来解决客户在存储和操纵数据库中XML数据时所面临的挑战,不仅程序员能够定义XML数据类型的变量、参数,创建处理XML类型数据的视图、触发器,还能够使用XQuery语言完成对XML文档结点的遍历和数据查询等。
由于篇幅所限,本节只简单介绍在SQL Sever 2008环境中如何将数据库基本表中的数据导出为XML文档,以及如何将XML文档数据导入数据库的基本表。
1、基本表导出为XML文档FOR XML是对标准SQL语言SELECT语句的扩展,数据库管理系统会根据FOR XML使用的模式,返回具有一定格式的XML文档片段以便不同应用程序或者用户之间进行数据交互。
在SQL Server 2008中使用带FOR XML子句的SELECT查询语句就可以从数据库基本表中获得XML数据,而FOR XML子句主要使用RAW和PATH模式。
(1) 单张基本表的导出为介绍方便,我们以第一章介绍的学生表(students)为例,并希望将这张学生表中的数据导出为XML 文档格式的数据,则只要使用表8-7中第3行的SELECT语句即可。
表8-7 将基本表数据导出为XML格式数据注意,表8-7中的第1行和第2行是指定SELECT语句操作的数据库,如果我们在前面已经使用了这个命令,则后面的操作就可以不使用这两行命令了。