Soy nuevo en consultas XML en SQL Server. Me gustaría escribir una consulta que
Como mi ejemplo a continuación: el tipo de mi columna es nvarchar(max)
y almacena el valor:
<Trainings>
<Training>
<Id>10</Id>
<Data>test1</Data>
<ItemOrder>1</ItemOrder>
</Training>
<Training>
<Id>12</Id>
<Data>test12</Data>
<ItemOrder>2</ItemOrder>
</Training>
<Training>
<Id>101</Id>
<Data>test111</Data>
<ItemOrder>3</ItemOrder>
</Training>
<Training>
<Id>102</Id>
<Data>test122</Data>
<ItemOrder>4</ItemOrder>
</Training>
</Trainings>
El resultado esperado debe ser:
<Trainings>
<Training>
<Id>10</Id>
<Data>test1</Data>
<ItemOrder>1</ItemOrder>
</Training>
<Training>
<Id>101</Id>
<Data>test111</Data>
<ItemOrder>2</ItemOrder>
</Training>
<Training>
<Id>102</Id>
<Data>test122</Data>
<ItemOrder>3</ItemOrder>
</Training>
</Trainings>
Intenté con la consulta de la siguiente manera, pero ¿cómo puedo encontrar el Training
número de nodo test12
en el Data
niño? y luego reordenar todo ItemOrder
para todos los Training
nodos.
CREATE TABLE Resume ([Training] nvarchar(max));
INSERT INTO Resume ([Training])
VALUES ('<Trainings><Training><Id>10</Id><Data>test1</Data><ItemOrder>1</ItemOrder></Training><Training><Id>12</Id><Data>test12</Data><ItemOrder>2</ItemOrder></Training><Training><Id>101</Id><Data>test111</Data><ItemOrder>3</ItemOrder></Training><Training><Id>102</Id><Data>test122</Data><ItemOrder>4</ItemOrder></Training></Trainings>');
DECLARE @string NVARCHAR(MAX)
SELECT @string = [Training]
FROM Resume
DECLARE @xml XML
SET @xml = CONVERT(XML, @string)
SET @xml.modify('delete (/Trainings/Training)[2]')
SET @string = CONVERT(NVARCHAR(MAX), @xml)
SELECT @string
Aquí está el enlace de Fiddle : http://sqlfiddle.com/#!6/894a0/3
Simplemente use XPath con el predicado que busca
set @xml.modify('delete (/Trainings/Training[./Data = "test12"])')
ACTUALIZACIÓN: para resolver también el segundo problema, propongo utilizar un enfoque relacional XML completamente diferente:
SELECT c.value('(./Id/node())[1]','int') AS Id,
c.value('(./Data/node())[1]','nvarchar(max)') AS Data,
row_number() over (order by c.value('(./Id/node())[1]','int')) as ItemOrder
FROM @xml.nodes('/Trainings/Training') AS A(c)
WHERE c.value('(./Data/node())[1]','nvarchar(max)') != 'test12'
FOR XML PATH('Training'),ROOT('Trainings'),TYPE
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras