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
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
我正在尝试按以下方式处理一些数据。
- 如果条目是数字,则将其转换为整数。
- 如果条目不是数字,请保持原样。
我正在使用 '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
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