使用sp_executesql计算查询结果而不执行查询

时间:2012-05-04 17:29:32

标签: sql tsql

是否有可能在不执行查询的情况下使用sp_executesql计算查询返回的结果数? 我的意思是:

我有一个在字符串中获取sql查询的过程。 示例:

SELECT KolumnaA FROM Users WHERE KolumnaA > 5

我想指定此查询将返回多少结果的计数,并将其存储在变量中,但我不想实际执行查询。

我无法使用此解决方案:

EXECUTE sp_executesql @sql          
SET @allCount = @@rowcount

因为它返回查询结果,除了获取返回行的计数。

6 个答案:

答案 0 :(得分:5)

你能以某种方式从上面的这个

生成另一个查询

SELECT count(*)FROM Uzytkownicy WHERE KolumnaA> 5

然后执行那个?

答案 1 :(得分:3)

一般情况下......

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

...在您的情况下可以简化为:

SELECT COUNT(*) FROM Users WHERE KolumnaA > 5

不能做得更便宜的原因是DBMS管理的数据中没有隐藏的“计数器”。 DBMS甚至不知道表中的总行数,更不用说满足事先不知道的标准的行数(例如KolumnaA > 5)。

因此,计数需要实际查找数据,因此需要“真实”查询。幸运的是,所有这些都发生在服务器上,并且只有少量数据被传输到客户端(计数本身),因此假设您的数据被正确编入索引,它应该非常快。

注意一致性:只是因为计数查询返回了某些计数,并不意味着“真实”查询将返回相同数量的行(在多个客户端可能同时修改数据的环境中)。 / p>

答案 2 :(得分:2)

使用:

SELECT COUNT(1) FROM Uzytkownicy WHERE KolumnaA > 5

是的,它确实执行了查询。但它不会返回行数以外的结果。

否则,我不知道如何避免返回结果。

答案 3 :(得分:2)

我认为这个问题有两个部分,我将讨论。

问题的第一部分是如何返回行计数而不是查询结果。这是使用Count(item)完成的。使用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 

答案 4 :(得分:1)

它将执行查询但它只返回计数而不是实际结果。

SELECT count(*) FROM Uzytkownicy WHERE KolumnaA > 5

答案 5 :(得分:1)

以下是我找到的结果:

Getting Rowcount within sp_executesql

基本上,按如下方式重写您的查询:

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

干杯。