2010-03-08 72 views
11

我遇到一些麻烦这一说法,因为这无疑给我的是什么,从这个select语句返回的无知:保存SELECT COUNT(*)值整数(SQL Server)的

declare @myInt as INT 
set @myInt = (select COUNT(*) from myTable as count) 

if(@myInt <> 0) 
begin 
    print 'there's something in the table' 
end 

在myTable中有记录,但是当我运行上面的代码时,print语句从不运行。进一步的检查表明,myInt在上面的分配之后实际上是零。我确定我错过了一些东西,但我认为select count会返回一个我可以在上面使用的标量?

+0

此代码可以在我可以访问的几台服务器上正常运行 - 您是否可以详细说明导致此行为的情况?旧的“SELECT COUNT(*)FROM Table”是否会返回您期望的内容? – SqlRyan 2010-03-08 20:12:56

回答

32

如果@myInt为零,则表示表中没有行:如果根本没有设置,它将为NULL。

即使表中没有行,COUNT也会始终返回一行。

编辑,2012年4月:Does COUNT(*) always return a result?

你计数/分配是正确的,但可能是两种方式:此规则在我的答案在这里描述

select @myInt = COUNT(*) from myTable 
set @myInt = (select COUNT(*) from myTable) 

但是,如果你是只是在寻找行的存在,(NOT)EXISTS更有效率:

IF NOT EXISTS (SELECT * FROM myTable) 
9
select @myInt = COUNT(*) from myTable 
+0

这不是答案,只是一个替代分配构造。它仍然会给“零” – gbn 2010-03-08 18:22:48

4
Declare @MyInt int 
Set @MyInt = (Select Count(*) From MyTable) 

If @MyInt > 0 
Begin 
    Print 'There''s something in the table' 
End 

我不确定这是否是您的问题,但您必须使用第二个单引号将print语句中的单引号括起来。虽然你可以使用SELECT来填充变量,但是如你在这里所做的那样使用SET就是很好,更清晰的IMO。另外,可以保证Count(*)永远不会返回负值,因此您只需检查它是否大于零。

+0

我更改了打印语句,所以在我的文章中(它有一个特定于业务的消息)是有意义的,并且忘记了避免引用。感谢您对选择/设置选择的帮助! – larryq 2010-03-08 18:17:54

0

[更新] - 好吧,我自己的愚蠢提供了这个答案。事实证明,在运行select COUNT语句之前,我正在从myTable中删除记录。

我是怎么做的,没有注意到?很高兴你问。我一直在测试sql单元测试平台(tsqlunit, if you're interested),并且作为我运行truncate table语句之一的测试之一,然后是上面的。单元测试结束后,所有内容都回滚,记录返回到myTable中。这就是为什么我在测试之外获得了一个记录数。

对不起大家......感谢您的帮助。