如何使FOR XML PATH不会阻塞ASCII控制代码

时间:2014-01-10 16:47:14

标签: sql sql-server xml sql-server-2005 xml-parsing

如果我在SQL Server 2005中执行以下代码:

stuff((
    SELECT char(31)
        + RTRIM(LTRIM(RTRIM(LTRIM(RTRIM(LTRIM(RTRIM(LTRIM(
            u.GivenName)) + ' ' + LTRIM(
            u.MiddleName))) + ' ' + LTRIM(
            u.FirmSurName))) + ' ' + LTRIM(
            u.NameTitle)))
    FROM  my_database.my_schema.my_table u
    FOR XML PATH(''),TYPE).value('.','nvarchar(max)')
    ,1,1,'') 

我收到此错误:

  

FOR XML无法序列化节点'NoName'的数据,因为它包含XML中不允许的字符(0x001F)。要使用FOR XML检索此数据,请将其转换为二进制,varbinary或图像数据类型,并使用BINARY BASE64指令。

问题是上面传递给char的数字。当您减少数字时会发生类似的错误,从30减少到20(这些都是控制代码,而不是可见字符)。但是,20到31是完全有效的XML字符;请参考此处:http://www.w3.org/TR/2008/REC-xml-20081126/#charsets

请注意,该语句完全按照char(32),char(9)或我已经尝试过的任何其他可打印ASCII字符的方式工作。

我的问题是,如何保留上述功能,同时还允许其他12个字符?我对31,30,29和28特别感兴趣,因为它们似乎明确用于分离结构化数据,这就是我在这里所做的,但更广泛地说,我想访问完整的XML字符集

编辑:哎呀,误读规范!由Mikael回答。

0 个答案:

没有答案