我正在尝试通过以下方式处理一些数据。
我正在使用“ try_cast”将数字项转换为整数。如果该条目不是数字,则为NULL。
declare @code varchar(3) = 'fff'
select try_cast(@code as int) as code
然后我想,好吧,如果我用一个notull捕获null,我将能够根据需要输出原始值。
declare @code varchar(3) = 'fff'
select isnull( try_cast(@code as int), @code) as code
但是我收到转换失败错误。
我没有想到这种行为。为什么会发生这种情况?我该如何实现所需的行为?
答案 0 :(得分:2)
TRY_CAST(... as int)
返回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
答案 1 :(得分:1)
由于不兼容,您遇到了类型转换错误。列是 整数或字符串,但不是两者。
当表达式中有两种类型时,数字占主导。换句话说,SQL Server尝试将字符串值转换为数字。当然,如果try_convert()
失败时隐式完成,则失败。
我建议两栏:
select try_cast(@code as int) as int_code, @code as orig_code
答案 2 :(得分:0)
这是一大段代码中的一段代码,是吗?在这种情况下,您不是要让函数根据输入动态返回不同的数据类型吗?
如果是这样,您可以通过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