J'ai besoin d'append des éléments XML dans une colonne XML dans SQL Server.
Voici un exemple simplifié de mon code:
DECLARE @temp XML = '<Rate>' + CONVERT(VARCHAR(20), @RateAmt, 1) + '</Rate>' UPDATE [TableName] SET [XMLValue].modify('declare namespace ns="http://www.mycompany.com/schema";insert sql:variable("@temp") as last into (/ns:Element1/ns:Element2)[1]') WHERE id = @Id
Voici la sortie:
<Rate xmlns="">12.00</Rate>
Donc, le code fonctionne, comment puis-je supprimer l'atsortingbut xmlns = ""?
Pourquoi insérez-vous un espace de noms si vous n'en voulez pas dans le xml?
DECLARE @RateAmt decimal(9,2) = 12.00 DECLARE @temp XML = '<Rate>' + CONVERT(VARCHAR(20), @RateAmt, 1) + '</Rate>' DECLARE @tempTable TABLE ( Column1 Xml ) INSERT INTO @tempTable(Column1) SELECT @temp
OU
UPDATE @tempTable SET Column1 = (SELECT @temp) SELECT * FROM @tempTable <Rate>12.00</Rate> (1 row(s) affected)
Il y a déjà une réponse acceptée (en particulier concernant votre problème d'espace de noms), super, juste quelques conseils:
Il y a de très rares situations où l'on devrait créer du XML via la concaténation de strings … En particulier en ce qui concerne les strings ( caractères spéciaux! ), Les nombres ( format! ) Et les valeurs date / heure ( culture et format! ) les traductions implicites en utilisant SELECT ... FOR XML ...
DECLARE @RateAmt DECIMAL(12,4)=12.0;
C'est possible, mais pas bon:
DECLARE @temp XML = '<Rate>' + CONVERT(VARCHAR(20), @RateAmt, 1) +'</Rate>'
Mieux vaut essayer
DECLARE @temp XML=(SELECT @RateAmt FOR XML PATH('Rate'));
Votre tentative d'insert ceci dans du XML existant peut être faite de la façon dont vous le faites déjà (créer le nœud XML en externe et l'insert tel quel), il pourrait être plus facile d'insert la valeur plain:
DECLARE @tbl TABLE(ID INT IDENTITY,XMLValue XML); INSERT INTO @tbl VALUES (N'<Element1><Element2><test>FirstTest</test></Element2></Element1>') ,(N'<Element1><Element2><test>Second</test></Element2></Element1>'); --ID=1: Insert the way you do it: UPDATE @tbl SET [XMLValue].modify('insert sql:variable("@temp") as last into (/Element1/Element2)[1]') WHERE id = 1 --ID=2: Insert the value of @RateAmt directly SET @RateAmt=100.00; UPDATE @tbl SET [XMLValue].modify('insert <Rate>{sql:variable("@RateAmt")}</Rate> as last into (/Element1/Element2)[1]') WHERE id = 2
C'est l'ID de résultat = 1
<Element1> <Element2> <test>FirstTest</test> <Rate>12.0000</Rate> </Element2> </Element1>
Et ID = 2
<Element1> <Element2> <test>Second</test> <Rate>100</Rate> </Element2> </Element1>