2017-01-09 93 views
2

我需要將一些XML元素添加到SQL Server中的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

很好的回答,投票這件事,但一個提示:你應該避免通過字符串連接來創建XML ......(儘管這是來自OP的文章)。還有更多的:你的'UPDATE/INSERT'對於OP來說不起作用,因爲他試圖在現有的XML中插入這個''元素...... – Shnugo

+0

創建XML的字符串連接來自最初的文章,而不是我的設計。 – Mike

+0

我知道...這只是要避免... – Shnugo

0

有一個公認的答案已經(特別是關於您的命名空間的問題),偉大的,只是一些提示:

有非常罕見的情況,其中一個應該通過創建XML字符串連接...特別是與字符串(特殊字符!),數字(格式!)和日期/時間值(文化和格式!)是更好的使用SELECT ... FOR XML ...

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

這是可能的,但不是很好的依靠隱式轉換:

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

更好試試這個

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

你試圖插入這到現有的XML可以完成你已經做到的方式(從外部創建XML節點並插入它原樣),可能更容易插入普通值:

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>