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