Как добавить узел или новый элемент в SQL Server, используя XQuery и тип данных xml - PullRequest
2 голосов
/ 11 января 2012

Это мой пример SQL Server XML

DECLARE @abc varchar(max),@Settingsxml XML,@DoesDefExist varchar(10)

SELECT @Settingsxml='<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib">
  <sys:Int32 x:Key="abc">1200</sys:Int32>
  <sys:Int32 x:Key="xyz">300</sys:Int32>
  <sys:Int32 x:Key="ghi">300</sys:Int32>
  <sys:String x:Key="def">Forgot your login or password? Please contact the IT Dept.</sys:String>
</ResourceDictionary>'

Я хотел бы добавить узел <sys:Int32 x:Key="def">300</sys:Int32> после элемента Key="abc"

Ответы [ 3 ]

1 голос
/ 11 января 2012

Тот же ответ, что и marc_s , но с использованием set для переменной XML вместо обновления для табличной переменной Не могу использовать with xmlnamespaces вот так ...

set @Settingsxml.modify('declare default element namespace "http://schemas.microsoft.com/winfx/2006/xaml/presentation";
                         declare namespace x="http://schemas.microsoft.com/winfx/2006/xaml"; 
                         declare namespace sys="clr-namespace:System;assembly=mscorlib";
                         insert <sys:Int32 x:Key="def">300</sys:Int32> 
                         after (/ResourceDictionary/sys:Int32[@x:Key="abc"])[1]')
1 голос
/ 11 января 2012

Вы можете добиться этого с помощью кода примерно так:

-- declare a table variable to hold the data
DECLARE @table TABLE (ID INT IDENTITY PRIMARY KEY, XmlContent XML)

-- insert your XML into that table variable
INSERT INTO @table(XmlContent) VALUES(@Settingsxml)

-- define the relevant XML namespaces and UPDATE the table
;WITH XMLNAMESPACES('http://schemas.microsoft.com/winfx/2006/xaml/presentation' AS ns,
'clr-namespace:System;assembly=mscorlib' AS sys,
'http://schemas.microsoft.com/winfx/2006/xaml' as x)
UPDATE @table
SET XmlContent.modify('insert <sys:Int32 x:Key="def">300</sys:Int32> after (/ns:ResourceDictionary/sys:Int32[@x:Key="abc"])[1]')
WHERE ID = 1

-- now, your XML stored in the table variable contains the new element where you wanted to have it
SELECT XmlContent FROM @table

В итоге получается:

<ResourceDictionary 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:sys="clr-namespace:System;assembly=mscorlib">
  <sys:Int32 x:Key="abc">1200</sys:Int32>
  <sys:Int32 x:Key="def">300</sys:Int32>
  <sys:Int32 x:Key="xyz">300</sys:Int32>
  <sys:Int32 x:Key="ghi">300</sys:Int32>
  <sys:String x:Key="def">Forgot your login or password? Please contact the IT Dept.</sys:String>
</ResourceDictionary>
0 голосов
/ 12 января 2012

Я узнал, как запросить, существует ли узел «abc», и как добавить «def» после «abc». Вот полный код ниже

...