2009-09-04 6 views
5
<game xmlns="http://my.name.space" ></game> 

Это мой корневой элемент. Я написал хранимую процедуру для вставки в нее элементов. Подводя итог хранимую процедуру, вот SQL-XQuery Вставка без пространства имен SQL2008

UPDATE ChessGame SET GameHistory.modify('insert <move><player>black</player><piece>pawn</piece><start>E7</start><end>E6</end></move> as last into (/game)[0]') WHERE Id = @GameId; 

Теперь, когда MSSQL делает вставку пустое пространство имен также вставляется так что результат этого

<move xmlns=""> 
    <player>black</player> 
    <piece>king</piece> 
    <start>E7</start> 
    <end>E6</end> 
</move> 

Теперь я попытался использовать как

WITH XMLNAMESPACES(DEFAULT 'http://my.name.space') 

и

GameHistory.modify('declare default element namespace "http://my.name.space"; insert ...') 

Но в итоге я получаю префиксы везде и декларация пространства имен для каждого элемента.

Проблемы возникают в библиотеках кода, которым не хватает логики для обработки префиксов, вставленных в MSSQL. В конце концов, я просто хочу вставить новый элемент в свой корень xml и оставить пустое пространство имен (используйте корень по умолчанию?). Я все очень новичок в этом, но, насколько я понимаю, если у меня есть пространство имен в моем корневом элементе, не все ли дочерние узлы имеют пространство имен по умолчанию моего корня?

ответ

2
declare @x xml; 
select @x='<game xmlns="http://my.name.space" ></game>'; 
set @x.modify('declare default element namespace "http://my.name.space"; 
    insert <move><player>black</player><piece>pawn</piece> 
    <start>E7</start><end>E6</end></move> as last into (/game)[1]'); 
select @x; 

Это дает:

<game xmlns="http://my.name.space"> 
    <move> 
    <player>black</player> 
    <piece>pawn</piece> 
    <start>E7</start> 
    <end>E6</end> 
    </move> 
</game> 

как на SQL 2005 с пакетом обновления 2 и SQL 2008 SP1.

Кроме того, это обновление таблицы работает отлично:

declare @t table (x xml); 
insert into @t (x) values ('<game xmlns="http://my.name.space" ></game>'); 
update @t 
set x.modify('declare default element namespace "http://my.name.space"; 
    insert <move><player>black</player><piece>pawn</piece> 
     <start>E7</start><end>E6</end></move> as last into (/game)[1]'); 
select * from @t; 
3

ОК, это работает для меня:

DECLARE @x XML; 
SET @x = '<game xmlns="http://my.name.space" ></game>'; 

select @x 

SET @x.modify(
    ' declare default element namespace "http://my.name.space"; 
    insert <move><player>black</player><piece>pawn</piece><start>E7</start><end>E6</end></move> as last into (/*:game)[1]' 
    ) 

select @x 
+0

Оба ваших сообщений работают 100% я нашел проблему, которая ломает мое, хотя. как последний в (/ game) [0] должен быть последним в (/ game) [1] Не означает ли [0] первое появление элемента? Очень похоже на массив с нулевым значением? – Matt

+1

@RBarry: почему вы предпочитаете '/ *: node'? Означает ли это «игровой узел с * любым * пространством имен»? –

+0

Мэтт: Нет, это порядковый номер: [1] - это первый экземпляр. – RBarryYoung

Смежные вопросы