sql - 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
我不相信视图是相关的,因为它没有处理列的连接,所以我没有包含视图的定义。此外,我删除了列/表名称,并用通用名称替换它们。我想我保留了完整的参考,但如果你在那里看到错误,那就是原因。
解决方案
推荐阅读
- uiscrollview - 为什么 UIScrollView 用 AutoLayout 计算出海量的 contentSize?
- javascript - 如何根据第一个结果发出辅助 HTTP 请求
- python-3.x - 如何根据公式提取特定页面?
- c# - 一个进程写入文件,我手动打开它(只读),出现异常“进程无法访问文件......”?
- json - 在变量中存储“JSON to HASH”输出会使 Data::Dumper 在 perl 中不起作用
- c# - Onclick 不是这个
- machine-learning - 辍学率理想值?
- azure - 使用 AcquireTokenSilentAsync 通过 Persisted TokenCache 重新进行身份验证
- java - 如何使用 Cordova-Advanced.Geolocation 在离子前端显示变量以及如何在地图上显示网络单元的位置
- ansible - Ansible-VMware 如何循环任务并为键提供值?