如何评估AND表达式?

时间:2013-11-08 12:31:55

标签: tsql sql-server-2012 exists logical-operators iif

我有以下情况:

DECLARE @DataSource TABLE
(
    [ID] BIGINT
)

INSERT INTO @DataSource ([ID])
VALUES (1)
      ,(2)
      ,(3)

DECLARE @IDForSearch VARCHAR(4) = 'TEXT'

如果我们尝试使用错误的类型参数提取记录:

SELECT IIF( EXISTS( SELECT 1 FROM @DataSource WHERE [ID] = @IDForSearch), 'Found', 'Missing') 

我们收到以下错误:

Msg 8114, Level 16, State 5, Line 14
Error converting data type varchar to bigint.

但如果我添加一个简单的isNumeric检查,一切正常:

SELECT IIF( ISNUMERIC(@IDForSearch) = 1 AND EXISTS( SELECT 1 FROM @DataSource WHERE [ID] = @IDForSearch), 'Found', 'Missing') 

我首先想到表达式的第一部分是执行的:

ISNUMERIC(@IDForSearch) = 1

并且因为它失败了,第二个没有被执行并且没有抛出错误。

但是,如果我改变表达式,那么一切都会再次起作用:

SELECT IIF( EXISTS( SELECT 1 FROM @DataSource WHERE [ID] = @IDForSearch) AND ISNUMERIC(@IDForSearch) = 1, 'Found', 'Missing')  

为什么在这些情况下没有错误?

1 个答案:

答案 0 :(得分:0)

我认为有一些内部演员(我说的是SQL 212),因为:

select IIF( 1='a','Found','Missing')

结果

Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the varchar value 'a' to data type int.

select IIF(isnumeric('a')=1 and 1='a','Found','Missing')

返回

Missing