Вы можете сделать
SET @xmlData.modify('insert attribute runat { "server" } into descendant::xxx[not(@runat)][1]');
Однако это изменит только первого потомка xxx
, не имеющего атрибута runat, по крайней мере, в SQL Server 2005 вы можете изменять только один узел за раз.
Возможно, объединение вышеперечисленного с WHILE поможет, например:
WHILE @xmlData.exist('descendant::xxx[not(@runat)]') = 1
BEGIN
SET @xmlData.modify('insert attribute runat { "server" } into descendant::xxx[not(@runat)][1]');
END
У меня нет доступа к SQL Server 2008 R2, но я думаю, что изменение все еще ограничено одним узлом за раз, так что вы можетепопробуйте
ALTER FUNCTION [dbo].[ConvertXmlData](@xmlData XML)
RETURNS XML
AS
BEGIN
WHILE @xmlData.exist('descendant::xxx[not(@runat)]') = 1
BEGIN
SET @xmlData.modify('insert attribute runat { "server" } into descendant::xxx[not(@runat)][1]');
END
RETURN @xmlData
END