Tsql 如何计算和表达式?

Tsql 如何计算和表达式?,tsql,sql-server-2012,exists,logical-operators,iif,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] = @IDForSe

我有以下情况:

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')  

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

我认为关于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.

返回

Missing

我不认为这是基于你写的顺序,正如你所展示的那样。您尚未指定使用哪一个数据库引擎,顺便说一句,它可以选择它喜欢的顺序,并且它可能决定IsNumeric的成本低于select。我的意思是,查询优化器将根据使用的顺序做出基于成本的决策。此外,acfrancis所说的,几乎任何事情都可能导致引擎在未来某个时间点更改其决策-服务器的任何补丁、索引的更改,等等。这是不幸的,但没有办法强迫它以一个特定的顺序计算WHERE子句。@Damien_,不信者,这正是我所担心的。为了避免将来的问题,我将拆分表达式。公平地说,我认为隐式转换失败只是因为变量被设置为“TEXT”。有很多方法可以防止这种情况,我认为这是不对的。看看我的回答。我不使用文本
Missing