如何在SQL Server中插入xmlns?

时间:2017-01-09 18:18:22

标签: sql sql-server xml

我需要在SQL Server的XML列中添加一些XML元素。

以下是我的代码的简化示例:

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 =“”属性?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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节点并将其插入 as as is ),插入平面可能更容易值:

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>