如何有效地检查表是否为空?

Col*_*las 4 sql sql-server sql-server-2008

在我正在编写的程序中,我需要检查表是否为空.我目前只有一个基本的SQL执行语句

Count(asterisk) from Table
Run Code Online (Sandbox Code Playgroud)

然后我有一个fetch方法来获取这一行,把它Count(asterisk)放入一个参数,这样我就可以检查它(如果count(*)<1则出错,因为这意味着表是空的).平均而言,count(asterisk)将返回大约11,000行.这样的事情会更有效吗?

 select count(*) 
 from (select top 1 * 
        from TABLE)
Run Code Online (Sandbox Code Playgroud)

但我不能让它在Microsoft SQL Server中工作

这将返回1或0,并且我将能够在执行语句时使用我的编程语言对此进行检查,并且我获取count参数以查看TABLE是否为空.

欢迎提出任何意见,想法或疑虑.

Seb*_*ine 8

如果表格为空,您正在寻找指示.为此,SQL具有EXISTS关键字.如果您在存储过程中执行此操作,请使用以下模式:

IF(NOT EXISTS(SELECT 1 FROM dbo.MyTable))
BEGIN
  RAISERROR('MyError',16,10);
END;
Run Code Online (Sandbox Code Playgroud)

如果您返回指标以在应用内进行相应操作,请使用以下模式:

SELECT CASE WHEN EXISTS(SELECT 1 FROM dbo.MyTable) THEN 0 ELSE 1 END AS IsEmpty;
Run Code Online (Sandbox Code Playgroud)

虽然大多数其他反应也会产生预期的结果,但它们似乎模糊了意图.

  • @Stoleg,你是对的,`()` 不是强制性的。这只是我采用的一种模式,总是将 `IF` 条件包装到 `()` 中,因为大多数其他语言都需要它。 (3认同)

小智 8

请在检查是否存在时使用 top 1,因为如果没有它,您将拥有与记录数量一样多的“1”:

IF NOT EXISTS(select top 1 1 from Table)
BEGIN
  RAISERROR('Error',0,1);
END;
Run Code Online (Sandbox Code Playgroud)


mus*_*cio 5

你可以尝试这样的事情:

select count(1) where exists (select * from t)
Run Code Online (Sandbox Code Playgroud)

SQLFiddle上测试

  • +1...我碰巧喜欢这种方法,因为它是标准的SQL. (3认同)