如何在MS SQL中转义&符号

时间:2014-06-25 14:45:45

标签: sql sql-server

我有一个名为tblCandy的表,其中包含名为CandySpecs的XML字段。当我尝试添加包含&符号(&)的值时,我收到错误:

UPDATE tblCandy SET OrigOtherData.modify ('insert <BrandName>M&Ms</BrandName> as first into (CandySpecs/Table)[1]') WHERE RecordID = 1


Msg 2282, Level 16, State 1, Line 1
XQuery [tblCandy.CandySpecs.modify()]: Invalid entity reference

我尝试了各种逃脱序列但没有运气:

/&
\&
&&

在这个问题上有很多指导,我想知道是否有一种解决这个问题的最佳方法。

4 个答案:

答案 0 :(得分:0)

SQL服务器中的特殊符号正在使用\

进行转义 您的示例语句中的

将如下所示:

UPDATE tblCandy SET OrigOtherData.modify ('insert <BrandName>M\&Ms</BrandName> as first into (CandySpecs/Table)[1]') WHERE RecordID = 1

答案 1 :(得分:0)

使用&amp;代替&。 我找到了这篇文章的答案:http://www.techrepublic.com/article/beware-of-the-ampersand-when-using-xml/

答案 2 :(得分:0)

这是处理此问题的更好方法:

UPDATE tblCandy SET OrigOtherData.modify ('insert <BrandName><![CDATA[M&Ms]]></BrandName> as first into (CandySpecs/Table)[1]') WHERE RecordID = 1

说明:CDATA标记告诉XML忽略此数据块的字符标记。

与StackOverflow相关的问题(严格来说不是重复的问题,但如果您对此不太熟悉,则值得阅读):What does <![CDATA[]]> in XML mean?

这不仅会绕过&,还会绕过您正在处理的数据中可能存在的其他潜在破坏数据,例如<>。 / p>

答案 3 :(得分:-1)

SET NOCOUNT ON
GO

CREATE TABLE tblCandy ( Id INT, Brandname XML )
GO

INSERT INTO tblCandy VALUES ( 1, '<Brandname >test</Brandname >' )
GO

SELECT 'before', * FROM tblCandy

UPDATE tblCandy 
SET Brandname.modify('replace value of (//Brandname/text())[1]
with string("as first into")')
WHERE Id = 1

SELECT 'After', * FROM tblCandy
GO

DROP TABLE tblCandy
GO