T-SQL确定性INT Cast

时间:2011-12-22 16:25:23

标签: sql-server tsql casting int deterministic

假设:

  • SQL Server
  • 名为TEST_TABLE
  • 的表格
  • TEST_TABLE中名为TEST_FIELD
  • VARCHAR(50) NOT NULL的列
  • 第1行:10YR3 / 6
  • 第2行:10YR3 / 2
  • 查询:SELECT TEST_FIELD FROM TEST_TABLE WHERE ...

问题:

在我的where条件中,我需要测试字符串最后一个字符的值。我注意到在Where子句中执行以下操作的行为相同。

  1. RIGHT(TEST_FIELD,1) > 3
  2. CAST(RIGHT(TEST_FIELD,1) AS INT) > 3
  3. 通过案例1中的一些推断演员,他们的行为是否相同?案例1是确定性的吗?

    提前致谢。

    马特

2 个答案:

答案 0 :(得分:2)

例如,当您检查值时,将完成转换:

DECLARE @t varchar(100)

SET @t = (SELECT 'ABCA2')

SELECT @t    

IF RIGHT(@t, 2) > 10
  SELECT 'Hi'
ELSE
  SELECT 'Bye'

将抛出错误,因为SQL无法在不抛出错误的情况下将A2转换为整数。

但是,如果您将@t替换为:

SET @t = (SELECT 'ABC12')

上述代码将在转换成功并且可以进行比较时起作用。正确的功能本身不会转换您的价值。 MSDN明确声明了RIGHT()的返回类型:

  

当character_expression是非Unicode字符时,返回varchar   数据类型。

     

当character_expression是Unicode字符数据时,返回nvarchar   类型。

为了让自己更容易,在完成与文本的比较时,完全取消函数RIGHT()

DECLARE @t varchar(100)

SET @t = (SELECT '1')

SELECT @t

IF @t < 10
  SELECT 'Hi'
ELSE
  SELECT 'Bye'

注意我没有拨打Right()。上面的结果是显示1然后是文本Hi。

答案 1 :(得分:0)

是的情况1是确定性的 - 要么成功从字符串到整数的隐式转换(结束然后是两个整数之间的比较),要么抛出异常。