如何不在SQL Server中插入xmlns?

如何不在SQL Server中插入xmlns?,sql,sql-server,xml,Sql,Sql Server,Xml,我需要在SQLServer的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(

我需要在SQLServer的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=属性

如果不希望在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


已经有一个公认的答案,特别是关于您的名称空间问题,很好,只是一些提示:

在非常罕见的情况下,应该通过字符串连接创建XML。。。特别是在与字符串和特殊字符相关的情况下!,数字格式!以及日期/时间值、文化和格式!更好的方法是使用SELECT。。。对于XML

这是可能的,但不好:

DECLARE @temp XML = '<Rate>' + CONVERT(VARCHAR(20), @RateAmt, 1) +'</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>

答案很好,投票赞成,但有一个提示:您应该避免通过字符串连接创建XML。。。虽然这是OP的帖子。此外:OP试图将这个元素插入到现有的XML中时,您的更新/插入将不适用于OP…创建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
<Element1>
  <Element2>
    <test>FirstTest</test>
    <Rate>12.0000</Rate>
  </Element2>
</Element1>
<Element1>
  <Element2>
    <test>Second</test>
    <Rate>100</Rate>
  </Element2>
</Element1>