18

在我目前正在编写的程序中,有一点我需要检查表是否为空。我目前只有一个基本的 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 是否为空。

欢迎任何意见、想法或疑虑。

4

7 回答 7

34

您正在寻找表是否为空的指示。因为那个 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;

虽然大多数其他响应也会产生预期的结果,但它们似乎掩盖了意图。

于 2013-06-24T21:06:05.687 回答
10

你可以尝试这样的事情:

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

SQLFiddle上测试

于 2013-06-24T20:47:14.383 回答
3

我想写关于EXISTS,但塞巴斯蒂安·梅内写得更快。虽然我更喜欢使用EXISTS,但还有另一种方法。

SELECT rows 
FROM sys.partitions 
WHERE object_id = object_id('MyTableName') 
    AND partition_number = 1
于 2013-06-24T21:11:10.197 回答
3

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

IF NOT EXISTS(select top 1 1 from Table)
BEGIN
  RAISERROR('Error',0,1);
END;
于 2021-04-29T11:58:38.137 回答
2

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

SELECT id, name FROM TABLE
GROUP BY id, name
HAVING COUNT(*) > 0
于 2013-06-24T20:42:21.597 回答
2

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

 select count(*) 
 from (select top 1 * 
        from TABLE
      ) t
于 2013-06-24T20:48:25.080 回答
0

IF EXISTS 可用于检查表是否为空。

IF EXISTS (select * from YourTable)
SELECT 'Table is not empty'
ELSE
SELECT 'Table is empty'
于 2022-01-25T08:20:33.237 回答