检查表中是否有可能不存在的记录

时间:2016-01-03 09:07:18

标签: sql-server tsql

我必须检查表中是否存在某些可能不存在的具有特定条件的记录,我必须在标量函数中执行此操作。

这是我的代码:

CREATE FUNCTION CheckIfRecordsExistInTestTable()
RETURNS INT
BEGIN
DECLARE @Result INT
SELECT @Result = 
CASE WHEN OBJECT_ID('TestTable') IS NULL THEN 0
ELSE
CASE WHEN EXISTS(SELECT * FROM TestTable) THEN
1
ELSE
0
END
END
RETURN @Result
END

在SQL Server中执行以下语句时尝试:

SELECT dbo.CheckIfRecordsExistInTestTable()

每当TestTable存在时,它都会返回我的预期结果。但是,每当它没有,SQL Server引发异常(无效的对象名称' TestTable')并且我无法得到我期望的结果(在这种情况下我想要一个零返回值)。 那么你打算为这个可编码为标量函数的问题做些什么呢?

3 个答案:

答案 0 :(得分:5)

另一个答案提供了正确的解决方法。

至于你为什么会遇到这个问题...

这是编译时错误。

如果语句引用了一个不存在的对象,那么编译将被推迟到执行之前,但最终仍然需要在执行之前将整个语句编译成执行计划。

当表不存在且该语句的执行甚至没有开始时,这会失败。

(尝试创建的执行计划 - 使用passthru predicate以避免在未满足CASE时评估条件

enter image description here

在解决方法中,针对SELECT的{​​{1}}被移入另一个语句。此声明的编译仍然推迟,并且由于声明从未执行,所有工作都可以。

答案 1 :(得分:4)

尝试像这样更改function

CREATE FUNCTION Checkifrecordsexistintesttable() 
returns INT 
  BEGIN 
      DECLARE @Result INT 

      IF Object_id('TestTable') IS NULL 
        SET @Result = 0 
      ELSE 
        SELECT @Result = CASE 
                           WHEN EXISTS(SELECT 1 FROM testtable) THEN 1 
                           ELSE 0 
                         END 

      RETURN @Result 
  END; 

要了解错误背后的原因,请查看Martin的回答。

答案 2 :(得分:0)

像这样更新功能:

CREATE FUNCTION CheckIfRecordsExistInTestTable()
RETURNS INT
BEGIN
DECLARE @Result INT
SELECT @Result = case when count(1) = 0 then 0 else 1 end  from sys.tables where name = 'TestTable'

RETURN @result

END