Как создать привязанную к схеме функцию, которая подсчитывает узлы в XML и затем может сохранить этот результат в столбце - PullRequest
0 голосов
/ 17 сентября 2010

У меня есть столбец 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

Результат последней операции:

aCount
3

И затем я создаю в этой таблице столбец с таким полем xml следующим образом:

alter table [XmlTable] add column [aCount] as (dbo.fnXmlCount_a([xml])) persisted

Ноя действительно хотел бы сделать следующее:

alter table [XmlTable] add column [aCount] as (dbo.fnXmlNodeCount([xml], 'a')) persisted

Спасибо!

Обновление:

Мы все знаем, что // действительномедленно, поэтому было бы здорово, если бы вы могли выяснить, как передать этот путь для поиска в другой переменной;по умолчанию этот путь поиска будет //.

Ответы [ 2 ]

5 голосов
/ 17 сентября 2010

Вот, пожалуйста:

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 
1 голос
/ 17 сентября 2010

Я придумал немного лучшее решение, но подход аналогичен подходу Дэниэла Реншоу.

create function [dbo].[fnXmlCount] (@xml xml, @nodeName nvarchar(max))  
returns int with schemabinding 
as begin 
return @xml.value('count(//*[local-name() = sql:variable("@nodeName")])', 'int')
end 

Однако до сих пор нет решения относительно того, как передать путь подсчитываемым узлам.

И для подсчета узлов в моей таблице XML требуется около 20 секунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...