2012-05-04 55 views
2

是否可能使用sp_executesql計算查詢返回的結果數而不執行查詢? 我的意思是:使用sp_executesql計數查詢結果而不執行查詢,使用sp_executesql

我有一個在字符串中獲取sql查詢的過程。 例子:

SELECT KolumnaA FROM Users WHERE KolumnaA > 5 

我想指定的這個查詢有多少成績回報計數,並將其存儲在一個變量,但我不想去實際執行查詢。因爲它返回的查詢結果中,除了獲得返回的行數

EXECUTE sp_executesql @sql   
SET @allCount = @@rowcount 

我不能使用此解決方案。

+0

你需要在數據庫或調用數據庫的應用程序的計數?當記錄集返回到調用應用程序時,通常它在記錄集對象上有一個行計數。 – xQbert

+0

你可以通過編輯問題來澄清你提到的問題嗎? (即你必須使用sp_executesql) –

回答

2

我認爲這個問題有兩個部分,我將解決。

問題的第一部分是如何返回行數而不是查詢結果。這是使用計數(項目)完成的。使用Count(1)而不是Count(KolumnaA)可以稍微快一點,因爲它只是計算要返回的行數,而不是檢索特定的列。

SELECT Count(1) FROM Users WHERE KolumnaA > 5 

第二部分是將它分配給一個變量。如果你需要使用sp_executesql的,你可以做如下:

Declare @sql varchar(4000) 
Declare @allCount int 
Set @sql = 'SELECT 1 FROM Users WHERE KolumnaA > 5' 
sp_executesql(@sql) 
SET @allCount = @@rowcount 

或者,你可以嘗試使用sp_executesql的輸出功能:

DECLARE @allCount int 

EXEC sp_executesql 
    N'@allCount = SELECT Count(1) FROM Users WHERE KolumnaA > 5', 
    '@allCount int OUTPUT', 
    @allCount OUTPUT 
+1

是的,但不幸的是我不得不使用sp_executesql – Mardok

+1

我編輯了我的答案給你一個方法來做到這一點。 –

+1

偉大的:D,現在@allCount保持查詢結果的計數 – Mardok

5

你能以某種方式產生從上面的一個類似這樣的

SELECT COUNT(*)FROM Uzytkownicy另一個查詢的WHERE KolumnaA> 5

,然後執行呢?

+0

是的,我可以編輯傳遞的查詢字符串。我看到這是我唯一的選擇:) – Mardok

2

用途:

SELECT COUNT(1) FROM Uzytkownicy WHERE KolumnaA > 5 

是,它並執行查詢。但它不會返回行數以外的結果。

否則,我不知道如何避免返回結果。

1

它將執行查詢,但它只會返回計數而不是實際結果。

SELECT count(*) FROM Uzytkownicy WHERE KolumnaA > 5 
3

在一般的情況下...

SELECT COUNT(*) FROM (<your query>) 

...這在你的情況下可以簡化爲:

SELECT COUNT(*) FROM Users WHERE KolumnaA > 5 

不能做得更便宜的原因是在DBMS管理的數據中沒有隱藏的「計數器」。 DBMS甚至不會知道表中的總行數,更不用說滿足事先不知道的標準的行數(例如KolumnaA > 5)。

因此,計數需要實際查找數據,因此它需要「真實」查詢。幸運的是,所有這些都發生在服務器上,並且只有很少量的數據被傳輸到客戶端(計數本身),所以假設您的數據被正確索引,它應該是非常快的。

儘管要注意一致性:僅僅因爲計數查詢返回了一定數量,並不意味着「真實」查詢將返回相同數量的行(在多個客戶端可能同時修改數據的環境中)。

1

下面是結果,我發現:

DECLARE @SQL NVARCHAR(1000) 
DECLARE @Count INT 
SET @SQL = 'SELECT KolumnaA FROM Users WHERE KolumnaA > 5; SELECT @Count = @@ROWCOUNT;' 
DECLARE @Params NVARCHAR(100) 
SET @Params = '@Count INT OUTPUT' 

EXEC sp_executesql @SQL, @Params, @Count = @Count OUTPUT 
PRINT @Count --should return the number of rows 

乾杯:

Getting Rowcount within sp_executesql

基本上,如下重新編寫查詢。