我在一个表中有一个 VARCHAR(MAX) 列,它可以以多种不同的格式存储数据,包括 GUID 格式。在另一个表中加入 UNIQUEIDENTIFIER 列时,我尝试了以下代码:
TRY_CAST(b.val AS uniqueidentifier) = a.guid_col
我收到以下错误:
消息 8152,级别 16,状态 10,第 73 行
字符串或二进制数据将被截断。
TRY_CAST的文档确实说在某些情况下会抛出错误:
但是,如果您请求明确不允许的转换,则 TRY_CAST 会失败并出现错误。
但是,SQL Server 允许从 VARCHAR 到 UNIQUEIDENTIFIER 的转换:
我能够找到一个引发错误的示例值。该值很长,所以我在其中包含了一个fiddle。有用的评论者提供了一个更简单的问题重现:
DECLARE @s VARCHAR(MAX) = REPLICATE(CAST('A' AS VARCHAR(MAX)), 8001);
SELECT TRY_CAST(@s AS UNIQUEIDENTIFIER);
为什么在尝试将某些 VARCHAR 值转换为 UNIQUEIDENTIFIER 时 TRY_CAST 抛出错误而不是返回 NULL 值?
文档中的转换表不区分
varchar
andvarchar(max)
,尽管and文档的另一部分说:CAST
CONVERT
同样相关,来自char 和 varchar:
当您向
varchar(max)
以非最大类型作为目标的TRY_*
函数提供 a 时,会尝试将大值转换为非最大字符串。如果成功,一切都很好。如果不是,您会收到“字符串或二进制数据将被截断”。错误,因为最大字符串不适合。这与上面的文档背道而驰,该文档指出发生了截断。我自己的经验是,
max
数据类型有时确实有不遵循转换图表或详细文档的行为。此行为并非特定于,问题中的演示将因或
uniqueidentifier
等其他类型而失败。bigint
date
我的回忆是,
TRY_*
对于兼容的类型sql_variant
(不包括大型类型),它将可靠地工作。您还可以使用 try 函数在 max 类型之间进行转换,只是不总是从 max 到 non-max。从用户体验的角度来看,这并不理想。我不知道这是文档错误还是意外行为。
作为解决方法,您可以在尝试转换之前将 LOB 文本转换为 GUID 的字符串表示形式的长度:
现有Microsoft 反馈项。
相关问答: