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