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 将查询结果集以XML形式展现 for xml path
sql server 2000中如何使用xml for path来进行字符串拼接