2010-03-08 71 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中。這就是爲什麼我在測試之外獲得了一個記錄數。

對不起大家......感謝您的幫助。