SQL Server - 包含FOR XML所需的无效XML标识符;

时间:2016-06-09 16:24:20

标签: sql sql-server xml

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

  

列名'中间名'包含所需的无效XML标识符   FOR XML; ' '(0x0020)是第一个出错的角色。

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

2 个答案:

答案 0 :(得分:11)

您不能在XML元素或属性名称中包含空格。使用

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if (requestCode == PLACE_PICKER_REQUEST) {
    if (resultCode == RESULT_OK) {
    Place place = PlacePicker.getPlace(data, this);
    String toastMsg = String.format("Place: %s", place.getName());
    Toast.makeText(this, toastMsg, Toast.LENGTH_LONG).show();
}
}
}

答案 1 :(得分:0)

对于最简单的情况,史密斯的解决方案可以正常工作。 由于我有约束要在我的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);
    }
}

请注意:

  1. XML标识符不能以数字开头,因此请以_为前缀并在c#中将其删除。
  2. XML标识符不接受
  3. =。应该用_之类的东西代替。
  4. 使用正确的编码代码页将原始字符串中的编码解码为字符串时,例如法语字符为1252。

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