我必须检查一些表中是否存在具有特定条件的记录,这些记录可能不存在,我必须在标量函数中执行此操作.
这是我的代码:
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
'),我无法得到我所期望的(我希望在这种情况下返回零值).那么你打算为这个可编码为标量函数的问题做些什么呢?
另一个答案提供了正确的解决方法.
至于为什么你会遇到这个问题......
这是编译时错误.
如果语句引用了不存在的对象,那么编译将被推迟到执行之前,但最终仍然需要在执行之前将整个语句编译为执行计划.
当表不存在并且甚至没有开始执行该语句时,这会失败.
(尝试创建的执行计划 - 使用passthru谓词以避免在CASE未满足时评估条件)
在变通方法中,SELECT
反对testtable
被移动到不同的语句中.此声明的编译仍然推迟,并且由于声明从未执行,所有工作正常.