如何创建一个模式绑定函数,该函数计算xml中的节点,然后能够将此结果保存在列中

Den*_*eev 0 sql t-sql sql-server sql-server-2005 sql-server-2008

我有一个xml列,我想在相邻的列中保留一个节点计数.

例如,在下面给出的xml中,我有3个节点a,所以我想输出它.

但是,我遇到的问题是我无法创建一个通用的模式绑定函数,该函数将使用@xml和@nodeName以返回指定节点的计数.

create function dbo.fnXmlCount_a (@xml xml) 
returns int with schemabinding
as begin
return (@xml.value('count(//a)', 'int'))
end

declare @xml xml;
set @xml = '
<r>
 <a></a>
 <b></b>
 <a></a>
 <c>
  <a></a> 
 </c>
</r>'

select dbo.fnXmlCount_a(@xml) aCount
Run Code Online (Sandbox Code Playgroud)

最后一次操作的结果是:

aCount
3
Run Code Online (Sandbox Code Playgroud)

然后我在该表上创建一个具有此xml字段的列,如下所示:

alter table [XmlTable] add column [aCount] as (dbo.fnXmlCount_a([xml])) persisted
Run Code Online (Sandbox Code Playgroud)

但我真正想做的是:

alter table [XmlTable] add column [aCount] as (dbo.fnXmlNodeCount([xml], 'a')) persisted
Run Code Online (Sandbox Code Playgroud)

谢谢!

更新:

我们都知道这//很慢,所以如果你能弄清楚如何通过这条路径来搜索另一个变量,那就太好了.默认情况下,此搜索路径将是//.

Dan*_*haw 5

干得好:

create function dbo.fnXmlCount (@xml xml, @name nvarchar(max))  
returns int with schemabinding 
as begin 
declare @count int
select @count = count(*)
from @xml.nodes('//*') as t(c)
where t.c.value('local-name(.)', 'nvarchar(max)') = @name
return @count
end 
Run Code Online (Sandbox Code Playgroud)