2017-01-09 8 views
2

SQL ServerのXML列にXML要素を追加する必要があります。ここでSQL Serverにxmlnsを挿入しない方法は?

は、私のコードの簡単な例です:ここでは

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 

は出力です:

<Rate xmlns="">12.00</Rate> 

ので、コードが動作している、しかし、どのように私は属性 "" =のxmlnsを削除するには?

答えて

1

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 

OR

UPDATE @tempTable 
SET Column1 = (SELECT @temp) 


SELECT * FROM @tempTable 

<Rate>12.00</Rate> 

(1 row(s) affected) 
+0

良い答えですが、 1つのヒント:文字列の連結を介してXMLを作成するのは避けるべきです(ただし、これはOPの投稿からのものです)。さらに、さらに:あなたの 'UPDATE/INSERT'は、この' '-elementを既存のXMLに挿入しようとすると、OPのためには機能しませんでした。 – Shnugo

+0

XMLを作成するための文字列の連結は、 。 – Mike

+0

私は知っている...それはちょうど避けるべきことです... – Shnugo

0

受け入れ答えが既にあり、偉大な、ちょうどいくつかのヒント:

あります1が経由してXMLを作成する必要があり、非常にまれな状況(特殊文字!)、数字(フォーマット!)、および日付/時刻値(文化とフォーマット!)これが良いことも可能ですが、ないSELECT ... FOR XML ...

DECLARE @RateAmt DECIMAL(12,4)=12.0; 

を使用して、暗黙的な翻訳に頼るはるかに優れている:挿入するには、この

DECLARE @temp XML=(SELECT @RateAmt FOR XML PATH('Rate')); 

あなたの試みをしてみてください

良い
DECLARE @temp XML = '<Rate>' + CONVERT(VARCHAR(20), @RateAmt, 1) +'</Rate>' 

これを既存のXMLに組み込むことは、すでに行っている方法で行うことができます(外部にXML-nodeを作成してをそのまま)、それはプレーンな値を挿入する方が簡単かもしれません:

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 

これを投票これは、結果のID = 1

<Element1> 
    <Element2> 
    <test>FirstTest</test> 
    <Rate>12.0000</Rate> 
    </Element2> 
</Element1> 

そして、ID = 2

<Element1> 
    <Element2> 
    <test>Second</test> 
    <Rate>100</Rate> 
    </Element2> 
</Element1> 
関連する問題