SQL Server - 包含 FOR XML 要求的无效 XML 标识符;

Posted

技术标签:

【中文标题】SQL Server - 包含 FOR XML 要求的无效 XML 标识符;【英文标题】:SQL Server - contains an invalid XML identifier as required by FOR XML; 【发布时间】:2016-06-09 16:24:20 【问题描述】:

我正在运行此查询并收到下面提到的错误。有人可以帮忙吗?

列名“中间名”包含无效的 XML 标识符,如 用于 XML; ' '(0x0020) 是第一个错误字符。

SELECT 
    Username as [LastName],
    '' AS [Middle Name],
    '' AS Birthdate,
    '' AS [SSN],
    0 AS [Wage Amount]
    FROM
    Employee
     FOR XML PATH

【问题讨论】:

【参考方案1】:

XML 元素或属性名称中不能有空格。使用

SELECT Username AS [LastName],
       ''       AS [MiddleName],
       ''       AS Birthdate,
       ''       AS [SSN],
       0        AS [WageAmount]
FROM   Employee
FOR XML PATH 

【讨论】:

很棒的提示!谢谢马丁。【参考方案2】:

对于最简单的情况,Smith 的解决方案可以正常工作。 由于我有限制在我的 XML 上保留字符,例如空格、@、'、/ 等,最后我通过使用 Base64 对标识符进行编码来解决这个问题。 (请注意名称的长度不能超过 128 位)然后在 XML 将被读取为输入数据的位置之外,另一个小代码将轻松地将 Base64 转换为原始字符串。

CREATE FUNCTION [dbo].[ufn_string_To_BASE64]
(
    @inputString VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
AS
BEGIN
    RETURN (
        SELECT
            CAST(N'' AS XML).value(
                  'xs:base64Binary(xs:hexBinary(sql:column("bin")))'
                , 'VARCHAR(MAX)'
            )   Base64Encoding
        FROM (
            SELECT CAST(@inputString AS VARBINARY(MAX)) AS bin
        ) AS bin_sql_server_temp
    )
END
GO

VARCHAR很重要,它会给我们带来更短的Base64代码。

您也可以在标识符中添加char(10)char(13)

动态 SQL 有助于构建临时表来存储中间数据。

在我的例子中,C# 将 Base64 解码为字符串

if (value.StartsWith("_"))

    var base64Encoded = value.Substring(1).Replace('_','=');
    try
    
        var data = System.Convert.FromBase64String(base64Encoded);
        value = Encoding.GetEncoding(1252).GetString(data);
    
    catch (Exception e)
    
        log.LogInformation(e.Message);
    

小心:

    XML标识符不能以数字开头,所以在c#中加上_前缀并去掉。 = 在 XML 标识符中不被接受。应该用 _ 之类的东西代替。 解码为字符串时原始字符串中的编码,使用正确的编码代码页,如法语字符的 1252。

实际上这比这里所说的要复杂。

【讨论】:

以上是关于SQL Server - 包含 FOR XML 要求的无效 XML 标识符;的主要内容,如果未能解决你的问题,请参考以下文章

Sql Server FOR XML PATH

SQL Server For XML

SQL Server 将查询结果集以XML形式展现 for xml path

sql server 2000中如何使用xml for path来进行字符串拼接

Sql Server 中FOR XML PATH(‘‘)函数用法

Sql Server 中FOR XML PATH(‘‘)函数用法