在SQL中使用CAST中的&符号

时间:2009-07-13 13:01:24

标签: sql sql-server xml casting ampersand

SQL Server 2005上的以下代码段在&符号'&'上失败:

select cast('<name>Spolsky & Atwood</name>' as xml)

有没有人知道解决方法?

更长的解释,我需要更新XML列中的一些数据,并且我正在使用搜索&amp;通过将XML值转换为varchar来替换类型hack,使用此强制转换替换和更新XML列。

5 个答案:

答案 0 :(得分:6)

它不是有效的XML。使用&amp;

select cast('<name>Spolsky &amp; Atwood</name>' as xml)

答案 1 :(得分:5)

select cast('<name>Spolsky &amp; Atwood</name>' as xml)

XML标准不允许XML标记内的文字&符号,并且任何XML解析器都无法解析此类文档。

XMLSerializer()会输出&号HTML - 编码。

以下代码:

using System.Xml.Serialization;

namespace xml
{
    public class MyData
    {
        public string name = "Spolsky & Atwood";
    }

    class Program
    {
        static void Main(string[] args)
        {
            new XmlSerializer(typeof(MyData)).Serialize(System.Console.Out, new MyData());
        }
    }
}

将输出以下内容:

<?xml version="1.0" encoding="utf-8"?>
<MyData
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <name>Spolsky &amp; Atwood</name>
</MyData>

&amp;代替&

答案 2 :(得分:3)

你也需要XML来逃避文本。

所以让我们回溯并假设您正在构建该字符串:

SELECT '<name>' + MyColumn + '</name>' FROM MyTable

你想做更多的事情:

SELECT '<name>' + REPLACE( MyColumn, '&', '&amp;' ) + '</name>' FROM MyTable

当然,你很可能应该照顾其他实体:

SELECT '<name>' + REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( MyColumn, '&', '&amp;' ), '''', '&apos;' ), '"', '&quot;' ), '<', '&lt;' ), '>', '&gt;' ) + '</name>' FROM MyTable

答案 3 :(得分:3)

在SQL中使用XML时,使用内置函数而不是手动转换它会更安全。

以下代码将构建一个正确的SQL XML变量,该变量看起来像基于原始字符串的所需输出:

DECLARE @ExampleString nvarchar(40)
    , @ExampleXml xml

SELECT  @ExampleString = N'Spolsky & Atwood'

SELECT  @ExampleXml =
    (
        SELECT  'Spolsky & Atwood' AS 'name'
        FOR XML PATH (''), TYPE
    )

SELECT  @ExampleString , @ExampleXml

答案 4 :(得分:0)

正如John和Quassnoi所说,&对它本身无效。这是因为&符号是字符实体的开头 - 用于指定无法按字面表示的字符。有两种形式的实体 - 一种是按名称指定字符(例如,&amp;&quot;),另一种是通过它的代码指定字符(我相信它是Unicode字符中的代码位置)设置,但不确定。例如,&#34;应代表双引号。)

因此,要在HTML文档中包含文字&,您必须指定它的实体:&amp;。您可能遇到的其他常见问题包括:&lt;<&gt;>&quot;"