在我正在编写的程序中,我需要检查表是否为空。我目前只有一个基本的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是否为空。
欢迎提出任何意见,想法或疑虑。
答案 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)
答案 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