SQL notull因try_cast失败

时间:2018-07-25 11:06:22

标签: sql-server tsql isnull

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

  • 如果条目为数字,则将其强制转换为整数。
  • 如果输入的内容不是数字,请保持原样。

我正在使用“ 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

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

我没有想到这种行为。为什么会发生这种情况?我该如何实现所需的行为?

3 个答案:

答案 0 :(得分:2)

TRY_CAST(... as int)返回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

答案 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