[英]How to escape ampersand in MS SQL
我有一个名为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
我尝试过各种转义序列,但是没有运气:
/&
\&
&&
关于此问题有很多指南,我想知道是否有解决此问题的最佳方法。
这是解决这个问题的更好方法:
UPDATE tblCandy SET OrigOtherData.modify ('insert <BrandName><![CDATA[M&Ms]]></BrandName> as first into (CandySpecs/Table)[1]') WHERE RecordID = 1
说明:CDATA标记告诉XML忽略此数据块的字符标记。
相关的StackOverflow问题(严格来说不是重复的问题,但是如果您不熟悉它,则值得阅读): XML中的<![CDATA []]>是什么意思?
这将不仅绕过&
,而且绕过其他可能破坏的数据段(例如<
和>
,这些数据可能存在于您正在处理的数据中。
SQL Server中的特殊符号使用\\
进行转义
在您的示例语句中将如下所示:
UPDATE tblCandy SET OrigOtherData.modify ('insert <BrandName>M\&Ms</BrandName> as first into (CandySpecs/Table)[1]') WHERE RecordID = 1
使用&
而不是&
。 我找到了本文的答案: http : //www.techrepublic.com/article/beware-of-the-ampersand-when-using-xml/
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.