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