2

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

我有一个以字符串形式获取 sql 查询的过程。例子:

SELECT KolumnaA FROM Users WHERE KolumnaA > 5

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

我不能使用这个解决方案:

EXECUTE sp_executesql @sql          
SET @allCount = @@rowcount

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

4

6 回答 6

5

你能不能像这样从上面的查询中生成另一个查询

SELECT count(*) FROM Uzytkownicy WHERE KolumnaA > 5

然后执行?

于 2012-05-04T17:32:14.850 回答
3

一般情况下...

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

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

SELECT COUNT(*) FROM Users WHERE KolumnaA > 5

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

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

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

于 2012-05-04T17:44:37.843 回答
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 
于 2012-05-04T17:42:27.820 回答
2

利用:

SELECT COUNT(1) FROM Uzytkownicy WHERE KolumnaA > 5

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

否则,我看不出如何避免返回结果。

于 2012-05-04T17:32:39.940 回答
1

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

SELECT count(*) FROM Uzytkownicy WHERE KolumnaA > 5
于 2012-05-04T17:41:58.427 回答
1

这是我发现的结果:

在 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

干杯。

于 2015-11-16T20:13:17.517 回答