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

时间:2013-06-24 20:39:51

标签: sql sql-server sql-server-2008

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

Count(asterisk) from Table

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

 select count(*) 
 from (select top 1 * 
        from TABLE)

但我无法在Microsoft SQL Server中使用它

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

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

6 个答案:

答案 0 :(得分:6)

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

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

如果您将指标恢复为在应用内部采取相应行动,请使用以下模式:

SELECT CASE WHEN EXISTS(SELECT 1 FROM dbo.MyTable) THEN 0 ELSE 1 END AS IsEmpty;

虽然大多数其他回复也会产生预期结果,但它们似乎模糊了意图。

答案 1 :(得分:5)

您可以尝试这样的事情:

select count(1) where exists (select * from t)

SQLFiddle

上进行测试

答案 2 :(得分:2)

你的变化很好。您只需要子查询上的别名:

 select count(*) 
 from (select top 1 * 
        from TABLE
      ) t

答案 3 :(得分:1)

这似乎是一种奇怪的方式来获得你想要的东西。你可以改用HAVING吗?

SELECT id, name FROM TABLE
GROUP BY id, name
HAVING COUNT(*) > 0

答案 4 :(得分:1)

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

java DemoTextField

答案 5 :(得分:0)

我想写一下EXISTS,但塞巴斯蒂安·梅恩得到的更快。虽然我更喜欢使用EXISTS,但还有一种方法。

SELECT rows 
FROM sys.partitions 
WHERE object_id = object_id('MyTableName') 
    AND partition_number = 1