如何不在SQL Server中插入xmlns?
我需要在SQLServer的XML列中添加一些XML元素 下面是我的代码的简化示例:如何不在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(
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>