我有以下情况:
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')
为什么在这些情况下没有错误?