首页 > 解决方案 > SQL Server 根据连接顺序抛出“无法序列化”

问题描述

我在 SQL Server 中看到了以前从未见过的东西。我收到有关仅基于加入顺序(看似)不允许的字符(垂直选项卡)的错误消息。请注意,我在实际数据中的任何地方都找不到该字符。

有没有其他人看过这个?提前致谢!错误和代码如下:

此查询失败:

SELECT 
    'prefix-' + COALESCE(CAST(a.id AS VARCHAR(MAX)), CAST(cta.id AS VARCHAR(MAX))) AS [object_id],
    objectValues.Value AS related_values
FROM 
    object_table a
CROSS APPLY 
    dbo.tvfGetValuesCsvForObject(a.id) AS objectValues
FULL OUTER JOIN 
    v_object_table_change_tracking_aggregation cta ON a.id = cta.id
WHERE 
    'object-' + COALESCE(CAST(a.id AS VARCHAR(MAX)), CAST(cta.id AS VARCHAR(MAX))) = 'object-123456'

错误信息:

消息 6841,级别 16,状态 1,第 111 行
FOR XML 无法序列化节点“NoName”的数据,因为它包含 XML 中不允许的字符 (0x000B)。要使用 FOR XML 检索此数据,请将其转换为二进制、varbinary 或图像数据类型并使用 BINARY BASE64 指令。

此代码成功:

SELECT 
    'prefix-' + COALESCE(CAST(a.id AS VARCHAR(MAX)), CAST(cta.id AS VARCHAR(MAX))) AS [object_id],
    objectValues.Value AS related_values
FROM 
    object_table a
FULL OUTER JOIN 
    v_object_table_change_tracking_aggregation cta ON a.id = cta.id
CROSS APPLY 
    dbo.tvfGetValuesCsvForObject(a.id) AS objectValues
WHERE 
    'object-' + COALESCE(CAST(a.id AS VARCHAR(MAX)), CAST(cta.id AS VARCHAR(MAX))) = 'object-123456'

请注意,两者之间的唯一区别是连接/交叉应用顺序,并且 a.id 中包含的值的基数相同(因为完全外部连接不会删除任何记录)。

我还包括了相关表值函数的定义:

CREATE FUNCTION dbo.tvfGetEaValuesCsvForProject (@object_id INT)
RETURNS TABLE 
AS 
    RETURN
    WITH CSVList AS
    (
        SELECT
        (
            SELECT 
                '"' + REPLACE(kvp.EAValueChar, '"', '') + '", ' ,
                '"' + REPLACE(kvp.EAValueCharMax, '"', '') + '", '
            FROM dbo.object_related_fields_kvp kvp
                JOIN dbo.field_definitions def 
                    ON def.id = kvp.id
            WHERE kvp.object_id = @object_id
                --text, longtext
                AND def.value_type IN (0,8)
            ORDER BY kvp.id 
            FOR XML PATH(''), TYPE
        ).value('.', 'varchar(max)') AS Value
    )

    SELECT 
        '[' + 
            --remove trailing comma
            LEFT(Value,LEN(Value) - 1)+ 
        ']' AS Value
    FROM CSVList
GO

我不相信视图是相关的,因为它没有处理列的连接,所以我没有包含视图的定义。此外,我删除了列/表名称,并用通用名称替换它们。我想我保留了完整的参考,但如果你在那里看到错误,那就是原因。

标签: sqlsql-serversql-optimization

解决方案


推荐阅读