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)
谢谢!
更新:
我们都知道这//很慢,所以如果你能弄清楚如何通过这条路径来搜索另一个变量,那就太好了.默认情况下,此搜索路径将是//.
干得好:
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)
| 归档时间: |
|
| 查看次数: |
7948 次 |
| 最近记录: |