nodes() 方法可生成特殊 XML 数据类型的实例
,每个实例都将其上下文设置为所选的不同节点
。此类 XML 实例支持 query()、value()、nodes() 和 exist() 方法
,并且可用在 count(*) 聚合中
。所有其他用法都会导致错误。
示例:nodes() 的用法
假设您希望提取名字不是"David"的作者的姓名,作为由两个列(FirstName 和 LastName)组成的行集。使用 nodes() 和 value() 方法可以达到此目的,如下所示:
SELECT nref.value('first-name[1]', 'nvarchar(50)') FirstName,
nref.value('last-name[1]', 'nvarchar(50)') LastName
FROM T CROSS APPLY xCol.nodes('//author') AS R(nref)
WHERE nref.exist('.[first-name != "David"]') = 1
在该示例中,nodes('//author') 会生成一个由对每个 XML 实例的 元的引用组成的行集。通过相对于这些引用对 value() 方法求值,可以获取作者的名字和姓氏。
SQL Server 2000 提供了使用 OpenXml() 从 XML 实例生成行集的功能。您可以指定行集的关系架构,并指定 XML 实例内部的值如何映射到该行集中的列。
示例:对 XML 数据类型使用 OpenXml()
我们可以像下面显示的那样,使用 OpenXml() 来改写上一示例中的查询,方法是:创建一个游标,将各个 XML 实例读入一个 XML 变量,然后向其应用 OpenXML():
DECLARE name_cursor CURSOR
FOR
SELECT xCol
FROM T
OPEN name_cursor
DECLARE @xmlVal XML
DECLARE @idoc int
FETCH NEXT FROM name_cursor INTO @xmlVal
WHILE (@@FETCH_STATUS = 0)
BEGIN
EXEC sp_xml_preparedocument @idoc OUTPUT, @xmlVal
SELECT *
FROM OPENXML (@idoc, '//author')
WITH (FirstName varchar(50) 'first-name',
LastName varchar(50) 'last-name') R
WHERE R.FirstName != 'David'
EXEC sp_xml_removedocument @idoc
FETCH NEXT FROM name_cursor INTO @xmlVal
END
CLOSE name_cursor
DEALLOCATE name_cursor