schema如何判断一个上级节点编号为空为空

XML数据类型的查询方法
我的图书馆
XML数据类型的查询方法
XML数据类型的查询方法 &&
13:01:50|&&分类:
表8.9只列出了XPath中的一些主要语法和主要
使用方法。有关XPath的更多信息在此不做更多地介绍,感兴趣的读者可选读与之相关的资料。
2. FLWOR支持
FLWOR实际上是一组命令的简称,这些命令主要用
于在编写XML查询时实现循环功能,它们分别是For命令、Let命令、Where命令、Order
By命令以及Return命令。
使用FLWOR命令实现循环查询时,需要定义用于控
制循环流程的控制变量,上述命令中Where和Order
By命令是可选的,而Return命令是必需的。
19】FLWOR语句的使用。
过示例简要地介绍FLWOR语句的使用方法,步骤如下。
打开【查询编辑器】,在其中输入以下Transact-SQL脚本代码:
@tmpXML AS XML
@tmpXML = '
&Categories&
&CategoryInfo
CategoryID ="1"&
&CategoryName&Beverages&/CategoryName&
&Description&Soft
drinks, coffees, teas, beers, and ales&/Description&
&/CategoryInfo&
&CategoryInfo
CategoryID ="2"&
&CategoryName&Condiments&/CategoryName&
&Description&Sweet
and savory sauces, relishes, spreads, and seasonings&/Description&
&/CategoryInfo&
&CategoryInfo
CategoryID ="3"&
&CategoryName&Confections&/CategoryName&
&Description&Desserts,
candies, and sweet breads&/Description&
&/CategoryInfo&
&CategoryInfo
CategoryID ="4"&
&CategoryName&Dairy
Products&/CategoryName&
&Description&Cheeses&/Description&
&/CategoryInfo&
&/Categories&
@tmpXML.query('
$var IN /Categories/CategoryInfo
($var)') AS test
上述Transact-SQL脚本中使用了XML数据类型的query()方法,该方法的相关内容将在随后的小节中进行介绍。脚本接下来使用FLWOR查
询XML类型变量@tmpXML中节点/Categories/CategoryInfo的值。单击【执行】按钮,运行上述Transact-SQL脚
本,其结果如图8.34所示。
如果想查询CategoryID为2的元素,可以在上述Transact-SQL脚本中添加一条Where从句,如下所示:
@tmpXML.query('
$var IN /Categories/CategoryInfo
$var /@CategoryID ="2"
($var)') AS test
图8.34& 查询结果
(4)&& 上述脚本代码中使用@CategoryID="2"作为查询条件。单击【执行】按钮,其结果如图8.35所示。
图8.35& 查询结果
3. XQuery函数
SQL Server
2005对XQuery提供的大量函数提供了支持,其中包括聚合类函数、数据访问函数、数值函数,字符串函数以及上下文函数等类型。经常被使用的函数如表
8.10所示。
表8.10& 常用函数
聚合类函数
完成各类统计功能,其中包括COUNT(计算)、AVG(求平均值)、MIN(最小值)、MAX(最大值)和SUM(求
数据访问函数
其中包括string,即返回一个代表XML节点的字符串和data,返回指定节点的值
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
包括CEILING(返回比指定值大的最小值)、FLOOR(返回比一个指定值小的最大值)、ROUND(返回最接近指
定值的整数)
字符串函数
完成字符串处理的函数,例如CONCAT(字符串连接函数)、CONTAINS(判断是否包含指定的子字符串)、
SUBSTRINT(获取子字符串)以及STRING-LENGTH(获取指定字符串的长度)
上下文函数
LAST(返回当前序列中被处理的项目数)、POSITION(返回指定项目在序列中的位置)
除表8.10中介绍的主要函数之外,SQL
Server 2005还对其他大部分XQuery函数提供了支持。下面通过一些示例进行简要地介绍。
【示例20】对示例19进行改造。
完整的设计过程如下。
(1)&& 将上面的Transact-SQL脚本的后半段改造如下:
SELECT @tmpXML.query('
FOR $var IN
/Categories/CategoryInfo
WHERE (data($var
/@CategoryID)) GT 2
RETURN ($var)
') AS test
上述代码中,使用了XQuery函数的data函数来获取属性CategoryID的值,因此可以执行数值比较操作。单击【执行】按钮,运行上述
Transact-SQL脚本,其结果如下所示:
&CategoryInfo
CategoryID="3"&
&CategoryName&Confections&/CategoryName&
&Description&Desserts, candies, and sweet
breads&/Description&
&/CategoryInfo&
&CategoryInfo
CategoryID="4"&
&CategoryName&Dairy Products&/CategoryName&
&Description&Cheeses&/Description&
&/CategoryInfo&
(3)&& 继续将上述Transact-SQL脚本改造为下面的形式:
SELECT @tmpXML.query('
FOR $var IN
/Categories/CategoryInfo
WHERE (data($var
/@CategoryID)) GT 2
ELEMENT CategoryInfo
ATTRIBUTE CategoryID
{string($var/@CategoryID[1])},
ELEMENT CategoryName
{string($var/CategoryName[1])},
ELEMENT Description
{string($var/Description[1])}
') AS test
(4)&& 其中使用了数值型函数string来返回指定节点的字符串值。单击【执行】按钮,其结果如图8.36所示。
图8.36& 查询结果
(5)&& 将上述Transact-SQL脚本改造如下:
SELECT @tmpXML.query('
FOR $var IN
/Categories/CategoryInfo
WHERE $var/@CategoryID
=MIN(Categories/CategoryInfo/@CategoryID)
ELEMENT CategoryInfo
ATTRIBUTE CategoryID
{string($var/@CategoryID[1])},
ELEMENT CategoryName
{string($var/CategoryName[1])},
ELEMENT Description
{string($var/Description[1])}
') AS CategoryInfo
上述Transact-SQL脚本代码中使用min函数获取属性CategoryID值最小的那个元素。单击【执行】按钮,其结果如图8.37所示。
图8.37& 查询结果
(7)&& 继续对上面的Transact-SQL脚本进行修改,在【查询编辑器】中输入下面的Transact-
SQL脚本代码:
SELECT @tmpXML.query('
FOR $var IN
/Categories/*[position()&=2]
ELEMENT CategoryInfo
ATTRIBUTE CategoryID
{string($var/@CategoryID[1])},
ELEMENT CategoryName
{string($var/CategoryName[1])},
ELEMENT Description
{string($var/Description[1])}
) AS CategoryInfo
上述Transact-SQL脚本中使用了上下文函数position(),通过该函数返回元素Categories中所含的前两项子元素的值。单击【执
行】按钮,所得结果如图8.38所示。
图8.38& 查询结果
读者如果想要了解与XQuery相关的更多函数及其
使用方法,可参见Microsoft提供的联机帮助文档。
8.5.2& 使用SQL Server 2005的XML数据类型方法进行查询
为了更好地满足用户使用XML数据的要
求,Microsoft SQL Server
2005引入了一种新的XML数据类型。这种数据类型有多种方法:query()、exist()、value()、nodes()和modify(),
它们实现了XML查询
(XQuery)规范中最重要的子集部分。下面仍以前面在示例数据库Northwind中创建的数据表xml_Categories为例介绍SQL
Server 2005提供的5种XML类型方法。
1. query方法
query方法可用于查询指定元素的XML文档表
示。下面就其使用方法进行简单的介绍。
【示例21】query方法的使用。
完整的设计过程如下。
(1)&& 首先,在【查询编辑器】中输入下面的Transact-SQL脚本:
&&& SELECT
* FROM xml_Categories
(2)&& 单击【执行】按钮,所获得的查询结果如图8.39所示。
图8.39& 查询结果
(3)&& 单击该记录中的CategoryInfo字段,查看该字段所含的XML文档,如下所示:
&CategoryInfo&
&CategoryName&Beverages&/CategoryName&
&Description&
drinks, coffees, teas, beers, and ales
&/Description&
&/CategoryInfo&
虽然,表中只有一条记录,不过并不妨碍我们使用该数据表来解释query方法的使用方法。如果此时想查找该记录的整个信息,可在【查询编辑器】中输入下面
的Transact-SQL脚本:
USE Northwind&
CategoryInfo.query('CategoryInfo')
FROM xml_Categories
WHERE CategoryID = 1
单击【执行】按钮可得到与上面一致的查询结果。如果只想查看该记录的类别名称,可输入以下Transact-SQL脚本:
USE Northwind&
CategoryInfo.query('CategoryInfo/CategoryName')
FROM xml_Categories
WHERE CategoryID = 1
上述Transact-SQL脚本中的
query函数使用了形如“根元素名/子元素名”的方式来查找子元素的值。需要注意的是,在指定要查询的子元素值时,必须从根元素起开始定位。
如果想查看与该字段相关的Description子元素的相关信息,同样可以在【查询编辑器】中输入下面的Transact-SQL脚本代码:
USE Northwind&
CategoryInfo.query('CategoryInfo/Description')
FROM xml_Categories
WHERE CategoryID = 1
(7)&& 单击【执行】按钮运行上述Transact-SQL脚本的结果如下所示:
&Description&Soft drinks, coffees, teas,
beers, and ales&/Description&
2. value方法
value方法为开发人员提供了直接访问XML文档
中元素或属性值的途径。利用该方法,可以在复杂的XML文档中直接获取指定元素或属性的值(即直接获取XML文档中某节点的值)value方法将直接返回
一个标量值。value方法的语法如下所示:
value(query_express, SQLType)
其中query_express为欲查询的XML文
档节点或节点属性的表达式,需要注意的是,与前面介绍的一样,表示属性时需要在其前面添加一个“@”符号。
【示例22】value方法的使用。
完整的设计过程如下。
为了更好地说明value方法的使用方法,下面为数据表xml_Categories添加一条新记录。在【查询编辑器】中输入下面的Transact-
SQL脚本代码:
USE Northwind
DECLARE @CategoryInfo
SET @CategoryInfo =
'&CategoryInfo&
&CategoryName&
&&&&&&& Condiments
&&& &/CategoryName&
&&& &Description
class ="baseinfo"&
&&&&&&& Sweet
and savory sauces, relishes, spreads, and seasonings
&&& &/Description&
&&& &Description
class ="Level"&
&&&&&&& Level
1 Credited by BeiJing Board Of Health
&&& &/Description&
&/CategoryInfo&'
INSERT INTO
xml_Categories(CategoryID,CategoryInfo)
VALUES(2,@CategoryInfo)
单击【执行】按钮,向数据表xml_Categories中插入一条新记录。此时,如果想查询第二条记录中有关元素Description的值,可以在
【查询编辑器】中输入下面的Transact-SQL脚本代码:
CategoryInfo.value('(CategoryInfo/Description)[1]', 'VARCHAR(100)')
CategoryInfo.value('(CategoryInfo/Description)[2]',
'VARCHAR(100)') Level
FROM xml_Categories
WHERE CategoryID =2
上述Transact-SQL脚本通过访问节点数组Description的第1和第2个元素来获取与该记录相关的两类描述信息。单击【执行】按钮,运行
上述Transact-SQL脚本,其结果如图8.40所示。
图8.40& 查询结果
(4)&& 如果想获取第二条记录中属性class的值,可以在【查询编辑器】中输入下面的Transact-SQL脚本:
CategoryInfo.value('(CategoryInfo/Description/@class)[1]',
'VARCHAR(100)')
ClassName1,
CategoryInfo.value('(CategoryInfo/Description/@class)[2]',
'VARCHAR(100)') ClassName2
FROM xml_Categories
WHERE CategoryID =2
(5)&& 上述代码中查询属性时使用了符号“@”。单击【执行】按钮,运行上述Transact-
SQL脚本,其结果如图8.41所示。
图8.41& 查询结果
3. modify方法
XML数据类型的modify方法用于修改元素(或
称为节点)的值。因此,可以使用modify方法来修改一个xml类型的变量或字段xml文档的相应元素或属性值。该方法的使用语法如下所示:
Modify(XML DML)
其中参数XML
DML,指的是XML数据修改语言(Data Modification Language,简称XML DML)。与SQL
Server为管理数据库对象提供的DML一样,XML
DML主要用于管理XML实例,其中包括插入(Insert)、删除(DELETE)以及替代(REPLACE VAULE
OF)三种操作。由于modify方法与XML
DML密切相关,因此本节暂不对modify方法的使用方法做过多的介绍,而在8.5.4节中进行详细说明。
4. nodes方法
XML数据类型的nodes方法可以轻松地将一个XML数据类型的实例(例如,一个XML变量或字段)转换为一组相互联系的数据,即数据集。换言之,使用
node()方法可以将XML中的某组元素转换为一组数据集中的记录。nodes方法使用语法如下所示:
Nodes (XQuery) AS Table(Column)
法形式上可以很容易地看出,Nodes方法可以将一个XML文档转换为表Table中的相应列(字段)。需要注意的是,这里的Table并非一个真正的物
理数据表,而是该查询结果集的别名。因此,数据表Table实际上并不存在。
【示例23】nodes方法的使用。
设计过程如下。
假如要查询数据表xml_Categories中字段CategoryInfo中的CategoryName节点,并将查询得到的结果集转换为以
tmpTable为其别名的数据表中的一个字段,可在【查询编辑器】中输入下面的Transact-SQL脚本:
USE Northwind
DECLARE @CategoryInfo
SELECT @CategoryInfo =
CategoryInfo FROM xml_Categories
WHERE CategoryId =1
CategoryName.value('(/CategoryInfo/CategoryName)[1]','VARCHAR(50)')
AS CategoryName
@CategoryInfo.nodes('/CategoryInfo/CategoryName')
tmptable(CategoryName)
上述Transact
SQL脚本首先使用一组SELECT语句将数据表xml_Categories中第一条记录的字段CategoryInfo保存到XML类型的变量
@CategoryInfo中,然后再使用XML数据类型的方法nodes,将查询结果集命名为tmpTable,同时将指定节点
“/CategoryInfo/CategoryName”的值转换为tmpTable中的名为CategoryName的字段。
单击【执行】按钮,运行上述Transact-SQL脚本代码,其结果如图8.42所示。
图8.42& 查询结果
5. exist方法
显然,exist方法是一个用于判断指定XML型结
果集中是否存在指定节点的方法。该方法返回的结果包括两种值,即1(当XML型结果集中至少包含一个查询节点时)或0(当XML型查询集中没有包含指定节
该方法的使用语法如下所示:
exist(‘XQeuryExpression’)
其中XQeuryExpression代表指定的
XML型查询语句,该查询语句将生成一组XML型结果集。
【示例24】exist方法的使用。
完整的设计过程如下。
下面依次来检查数据表xml_Categories中的字段CategoryInfo中存在的节点情况,在【查询编辑器】中输入下面的Transact-
CategoryInfo.exist('/CategoryInfo/CategoryName') AS 是否存在CategoryName节点,
&&&&CategoryInfo.exist('/CategoryInfo/Description') AS
是否存在Description节点,
CategoryInfo.exist('CategoryName/Description') AS
节点CategoryName下是否存在Description节点
xml_Categories
(2)&& 单击【执行】按钮,运行上述Transact-SQL脚本,其结果如图8.43所示。
图8.43& 查询结果
8.5.3& 启用OPENXML
如果说SQL Server 2005通过FOR
XML子句为用户提供了一种将查询结果集转换为XML文档的方法,那么OPENXML记录集函数则为用户提供了一种将XML文档转换,并导入数据表的途
径。即使用FOR
XML可以把关系型数据检索为XML;而使用OPENXML则可以把XML文档转为关系型数据表。将XML文档转换为关系型数据表的好处之一是,便于对这
些数据施加数据表操作(例如执行查询等)。SQL Server
2005进一步提高了原有的OPENXML功能。除了能够处理XML数据类型之外,还进一步提供了对几种新的数据类型的支持,例如用户自定义类型
(UDTs)等。用户可以通过OPENXML
WITH子句使用OPENXML功能,也可以通过向系统自带的存储过程sp_preparedocument传递一个XML数据类型实例来访问该功能。
实际上,OPENXML功能是Transact-
SQL提供的一种XML文档访问功能。在使用OPENXML功能之前,必须首先调用系统存储过程sp_xml_preparedocument
来解析指定的XML文档。该存储过程可以返回被解析XML文档的句柄,通过该句柄,用户就可以像管理关系型数据集一样来管理被解析后的XML文档数据了。
1. OPENXML简介
使用OPENXML的语法如下所示:
OPENXML ( idoc, rowpattern, [flags] )
&&&&& [ WITH (
&schemaDeclaration&& [ ,...n ] | tableName ) ]
&& &&schemaDeclaration&
&&&&& && colName
colType [colPattern | metaProperty]
上述语法中主要参数的含义如表8.11所示。
表8.11& 主要参数
指向XML文档的句柄,可以使用SQL Server 2005系统自带的存储过程来获取该句柄
用于指定XML数据与记录集间的映射关系
rowpattern
用于指定XML文档中哪些节点需要被转换为数据表中的记录
schemaDeclaration
指定需要使用的数据集架构,例如字段及字段类型等
如果已存在一个具有指定架构的数据表,而且无需对字段类型进行任何限制,此时可以使用一个数据表名来替代前面的XML架
结果集中的字段名
结果集中字段的数据类型
colPattern
用于说明如何将XML节点映射为结果集中的字段
metaProperty
用于获取与XML节点相关的信息
flags参数用于指明XML数据与记录集间的
映射关系,具体含义如表8.12所示。
表8.12& flags参数具体含义
如果没有任何具体要求可以选择0
以属性为中心,即将XML的属性映射为由schemaDeclaration定义的字段
以元素为中心,即将XML中的元素映射为由schemaDeclaration定义的字段
XML_ATTRIBUTES 或
XML_ELEMENTS 组合使用(逻辑OR)。在检索的上下文中,该标志指明不应将已消耗的数据复制到溢出属性 @mp:xmltext
OPENXML方法相关的其他参数,在此不做过多介绍。详情请参见Microsoft提供的联机帮助文档。下面通过示例进一步介绍SQL Server
2005中提供的OPENXML功能。
2. sp_xml_preparedocument系统存储过程简介
OPENXML功能配置使用的另一系统存储过程的语法如下所示:
sp_xml_preparedocument
[ , xmlText ] [ , xpathNamespaces ]
该系统过程使用的主要参数如表8.13所示。
表8.13& 主要参数
用于解析XML文档的句柄
需要被解析的XML文档
xPathNamespaces
记录和字段的命名空间表达式
3. sp_xml_removedocument系统存储过程简介
完成XML文档到数据表的转换之后,可以使用系统存
储过程sp_xml_removedocument 来释放转换句柄所占用的内存资源。该存储过程的使用方法如下所示:
&&& sp_xml_removedocument hDoc
其中hDoc为需要释放的句柄。
【示例25】OPENXML应用举例。
下面通过示例来具体介绍OPENXML功能的使用方
法,完整的设计过程如下。
(1)&& 打开【查询编辑器】,输入以下Transact-SQL脚本代码:
USE Northwind
DECLARE @idoc INT
DECLARE @CategoryInfo xml
SET @CategoryInfo =
(SELECT CategoryInfo FROM
xml_Categories
& WHERE CategoryID = 1)
sp_xml_preparedocument @idoc OUTPUT, @CategoryInfo,
& N'&CategoryInfo/&'
SELECT * FROM OPENXML
(@idoc, N'CategoryInfo',2)
& CategoryName VARCHAR(50)
N'CategoryName',
& Description VARCHAR(200)
N'Description'
sp_xml_removedocument @idoc
上述Transact-SQL脚本首先将示例数
据表xml_Categories中的第一条记录的XML类型字段保存到XML类型变量@CategoryInfo中。然后使用系统存储过程
sp_xml_preparedocument获取一个指向XML类型变量@CatgoryInfo的句柄,并指定要检索的XML节点。
(2)&& 接下来,在FROM
OPENXML中指定需要检索的元素名。由于示例数据表xml_Categories中的第一条记录所含XML文档中没有包含任何属性,因此,这里只将根
元素&CategoryInfo&中的子元素CategoryName和Description转换为关系型数据集,因此需要将flag设置
为2。由于没有现存的数据表可用,这里使用参数schemaDeclaration来定义关系型数据集的架构,其中指定了该数据集中包含的两个字段,分别
为CategoryName和Description,并分别定义了这些字段的类型(VARCHAR(50)和VARCHAR(2000))。
(3)&& 最后使用系统存储过程sp_xml_removedocument释放指定名柄变量@idoc所占用的资源。
(4)&& 单击【执行】按钮,执行上述Transact-SQL脚本代码,其结构如图8.44所示。
图8.44& 查询结果
(5)&& 继续在【查询编辑器】中输入下面的Transact-SQL脚本代码:
USE Northwind
DECLARE @idoc INT
DECLARE @CategoryInfo
SET @CategoryInfo =
(SELECT CategoryInfo FROM xml_Categories
& WHERE CategoryID
EXEC sp_xml_preparedocument
@idoc OUTPUT, @CategoryInfo,
N'&CategoryInfo/&'
SELECT * FROM OPENXML
(@idoc, N'CategoryInfo/Description',1)
& ClassType
VARCHAR(50) N'@class'
sp_xml_removedocument @idoc
与上一示例不同,上述Transact-SQL脚本用于将元素&Description&的属性class转换为关系型数据集中的字段
ClassType,因此在使用OPENXML方法时需要将flag参数设置为1。单击【执行】按钮,运行上述Transact-SQL脚本,其结果如图
8.45所示。
图8.45& 查询结果
8.5.4& 使用XML DML
1. 基本概念
当前的XQuery
规范包括查询的语法和语义词,但没有提供对XML文档进行修改的功能。为了弥补这一不足,Microsoft在其SQL Server
2005中提供了名为XML数据修改语言(DML)的XML扩展功能,该功能是对XQuery数据修改特性的扩展。SQL
Server&2005在其提供的XML命令集中增加了3个关键字:即Insert、Update和Delete。这三个关键字与XML数据类型的
modify()方法相互配合可以实现对XML文档的修改功能。
2. XMl DML命令简介
DML为XML文档的修改功能提供了以下三种方法。
xml.modify(Insert):使用xml.modify(Insert)可以向XML数据类型实例中的一组序列节点中插入一个新的节点。该关键
字的使用方法如下所示:
Insert Expression1
&( {AS FIRST | AS LAST}
INTO | AFTER | BEFORE
Expression2 )
主要参数如表8.14所示。
表8.14& 主要参数
Expression1
用于指定欲插入的节点的表达式,需要注意由于插入操作不能针对根节点,所以表达式中不能带有符号“/”
Expression2
指定XML文档中与新插入节点相关的一个节点表达式
AS FIRST/LAST
如果待插入的节点Expression1将要成为Expression2的一个子节点,可使用该参数来指定新节点在
Expression2中的位置
AFTER/BEFORE
如果待插入的节点Expression1与Expression2同级,可以使用该参数来指定XML文档中
Expression1相对于Expression2的位置
xml.modify(Delete):使用xml.modify(Delete)可以删除指定XQuery表达式中的0个或多个节点。该关键字的使用方
法如下所示:
DELETE Expression
其中参数Expression为要删除的节点表
xml.modify(replace):被用于修改一个指定节点的值。该关键字的使用方法如下所示:
REPLACE value of
Expression1 WITH Expression2
其中参数Expression1和
Expression2分别表示被替换节点的旧值和用于替换旧值的新值。
下面分别通过示例对上述3个关键字进行介绍。
【示例26】3个关键字的使用。
完整的设计过程如下。
(1)&& 打开【查询编辑器】,在其中输入以下Transact-SQL脚本:
USE Northwind
INSERT INTO
xml_Categories (CategoryID, CategoryInfo)
VALUES (3,
'&CategoryInfo&&/CategoryInfo&')
SELECT CategoryInfo
FROM xml_Categories WHERE CategoryID = 3
上述Transact-SQL脚本在数据表xml_Categories中插入一条新记录,其XML型字段CategoryInfo中只带有一个根节
点&CategoryInfo/&。单击【执行】按钮运行上述Transact-SQL脚本,其结果如图8.46所示。
(3)&& 继续在【查询编辑器】中输入以下Transact-SQL脚本代码:
UPDATE xml_Categories
CategoryInfo.modify('Insert (
&CategoryName&Produce&/CategoryName&,
&&& &Description&Dried
fruit and bean curd&/Description&)
&AS LAST INTO
(/CategoryInfo[1])')
WHERE CategoryID = 3
SELECT CategoryInfo
FROM xml_Categories
图8.46& 查询结果
上述Transact-SQL脚本在使用UPDATE更新第三条记录时,使用INSERT命令向原有的&CategoryInfo&节点相继
插入CategoryName元素和Description元素。单击【执行】按钮,运行上述Transact-SQL脚本,其结果如图8.47所示。
图8.47& 查询结果
(5)&& 在查询编辑器中输入下面的Transact-SQL脚本:
UPDATE xml_Categories
CategoryInfo.modify('REPLACE value of
(/CategoryInfo/Description/text())[1]
WITH “Dried fruit and bean curd
seasoning”')
WHERE CategoryID = 3
SELECT CategoryInfo
FROM xml_Categories
(6)&& 上述Transact-SQL脚本代码使用replace value
of关键字对数据表xml_Categories中的第3条记录的CategoryInfo字段的节点/CategoryInfo
/Description进行修改,将该元素原来的值Dried fruit and
bean curd更改为Dried
fruit and bean curd and seasoning如图8.48所示。
(7)&& 继续在【查询编辑器】中输入下面的Transact-SQL脚本:
USE Northwind
UPDATE xml_Categories
SET CategoryInfo.modify('DELETE
/CategoryInfo/Description')
WHERE CategoryID = 3
SELECT CategoryInfo
FROM xml_Categories
图8.48 查询结果
上述Transact-SQL脚本代码使用Delete关键字删除节点/CategoryInfo/Description。单击【执行】按钮,其运行结
果如图8.49所示。
图8.49& 运行结果
由图8.49可见,原XML文档中的节点
Description已被删除。
DML的使用方法进行了简要介绍,有关XML DML的更多用法请参见Microsoft提供的联机帮助文档。
喜欢该文的人也喜欢常见节点功能
不是 IT 专业人员?
TechNet 库
要查看英语原文,请勾选“英语”复选框。也可将鼠标指针移到文本上,在弹出窗口中显示英语原文。
建议使用 Visual Studio 2017
常见节点功能
三个函数为所有数据视图节点是常见的:
节点显示名称
节点的子节点
具有节点 ID 的两种类型,根据使用的上下文。
对于静态节点指定,这是节点没有基础对象的节点 ID,比为具有基础对象的非静态节点指定节点 ID 包含一个不同的值。
请注意对节点 ID 的引用对应于 DataViewSupport 架构定义的 nodeId XML 属性。
静态节点的节点 ID 是非静态表示形式生成该非静态节点路径的节点的全名的一部分。
例如,下面的表示全名 (完整路径) 的 “生成”表,为非静态节点,并包含静态节点 “表”:“/Tables/UserTables/Table pubs.dbo.authors []”。
在这种情况下,节点 ID 为 “/Tables/UserTables/”,因为这会导致所涉及的节点的是路径。
但是,非静态节点的节点 ID 表示包含选定的对象属性其下方的节点。
此节点通常是要选择的对象的父节点。 具体而言,对象选择过程查找下一个父节点的节点 ID 在中,即视图层次结构中,可以选择对象的属性,如果第一个父级未提供这些属性,下父节点 ID 该层次结构中处于选中状态,直至找到限定的父级。
例如,假设一个非静态表节点存在于包含名为 “au_id”和 “au_name”的两个列称为 “author's”的视图层次结构。
此表和其他表在下 “表”静态节点。 若要选择这些列,客户端需要标识列选择的父级的节点 ID,在此示例中为选定节点的节点 ID。 下面的 XML 文档此示例。
&StaticNode nodeId="Tables"&
&Children&
&Selection type="Table"&
&SelectionNode nodeId="Table"&
&Children&
&Selection type="Column" restrictions="{Table.Name}"&
&/Selection&
&/Children&
&/SelectionNode&
&/Selection&
&/Children&
&/StaticNode&
层次结构节点可以具有显示与其在 Visual Studio 服务器资源管理器的图标的显示名称。
,因为可用于其他节点类型,推断只有静态节点,包括静态连接节点,需要显示名称。
若要启用节点的显示名称,请使用 DisplayName 元素。
这允许您指定节点名称显示在 IDE,以及指定如何设置显示名称。 (对于连接节点,相应的元素调用 InitialDisplayName 元素,因为显示名称连接节点都可由用户修改。)格式显示名称,使用简单字符串内容或引用 XML 的资源部分显示的资源。
通过使用选项 when 属性,可以,有条件地,将显示名称,可以指定计算表达式确定给定的格式是否正确在给定的情况下设置。
显示名称和格式的条件应用程序可以出于多种原因导致。
例如,您可能希望为表名旁边仅显示所有者名称在+这+个+情况+下所有者名称与当前用户名不同。
在显示有代表性的 XML 下面的代码示例处理的显示名称的条件应用程序,如上述方案中所述。
&SelectionNode&
&DisplayName when="NOT ({Schema} = {Database.UserName})"&
{Name} ({Schema})
&/DisplayName&
&/SelectionNode&
但是,此条件表达式的文本表达式如下:此节点,选择,在表模式与当前用户不相等在数据库中情况下,显示名称值应为括号的表的所有者遵循的数据库表的名称。在此示例中未显示名称,,而是一个条件表达式指定名称格式。 ,因为这些节点类型允许默认格式从基础对象,派生时允许对象连接节点并选择节点。 对静态连接节点,另一方面,该模式强制提供至少一个 DisplayName 元素的要求。
节点必须使用 Children 元素指定其子节点。
具有子节点的三种类型:
所有节点可以具有子级的静态节点,包括另一个静态节点。 例如,展开 “基表”集合可能显示 “系统表”和 “用户”表。
此子节点类型扩展到基于服务器枚举对象的选择的子节点。 为了演示此,假设在要显示表列出了来自数据源的数据视图。 您可以编写执行此操作的以下 XML:
&StaticNode&
&DisplayName&Tables&/DisplayName&
&Children&
&Selection type="Table"/&
&/Children&
&/StaticNode&
上面的 XML 将导致层次结构如下所示:
- &Table 1&
- &Table 2&
此页面有帮助吗?
更多反馈?
1500 个剩余字符
我们非常感谢您的反馈。
页面加载速度够快吗?
您喜欢网页的设计吗?
请告诉我们更多意见

我要回帖

更多关于 节点提示内容为空 的文章

 

随机推荐