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

ham*_*eza 5 t-sql sql-server

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

这是我的代码:

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
Run Code Online (Sandbox Code Playgroud)

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

SELECT dbo.CheckIfRecordsExistInTestTable()
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ith 5

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

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

这是编译时错误.

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

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

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

在此输入图像描述

在变通方法中,SELECT反对testtable被移动到不同的语句中.此声明的编译仍然推迟,并且由于声明从未执行,所有工作正常.

  • 你是天才男人.我已经更新了我的答案.我只是`Sql Server`的初学者学习所有这些东西:) (2认同)

Pரத*_*ீப் 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; 
Run Code Online (Sandbox Code Playgroud)

要了解有关错误背后原因的更多信息,请查看马丁的回答。