SQL isnull 失败 try_cast

SQL isnull fails with try_cast

我正在尝试按以下方式处理一些数据。

我正在使用 'try_cast' 将数字条目转换为整数。如果条目不是数字,这将给出 NULL。

declare @code varchar(3) = 'fff'
select try_cast(@code as int) as code

然后我想,好吧,如果我用 isnull 捕获 null,我将能够根据需要输出原始值。

declare @code varchar(3) = 'fff'
select isnull( try_cast(@code as int), @code) as code

但是我收到转换失败错误。

我没想到会有这种行为。为什么会发生这种情况,我怎样才能实现所需的行为?

由于不兼容,您遇到了类型转换错误。该列是 整数或字符串,但不能同时是两者。

当表达式中有两种类型时,数字类型占主导地位。换句话说,SQL 服务器尝试将字符串值转换为数字。当然,当 try_convert() 失败时隐式完成时,这会失败。

我建议两列:

select try_cast(@code as int) as int_code, @code as orig_code

TRY_CAST(... as int) return INT数据类型, ISNULL(INT, VARCHAR(3)) 都导致 INT

ISNULL: Returns the same type as check_expression.

declare @code varchar(3) = '123'
select ISNULL(CAST(try_cast(@code as int) as VARCHAR(3)),@code ) as code

可以使用

COALESCE: Returns the data type of expression with the highest data type precedence

但 INT 上层 VARCHAR Data type precedence

这是一个更大的代码体中的一个代码块,是吗?比如,您不是在尝试根据输入动态地 return 不同的数据类型吗?

如果是这样,您可以通过 if-else 块使用 sql_variant_property 来引导控制流吗?例如

declare @code varchar(3) = 'fff' if SQL_VARIANT_PROPERTY(@code,'BaseType') = 'INT' begin print 'do numeric comparison' end else begin print 'do string comparison' end