是否有可能在不执行查询的情况下使用sp_executesql计算查询返回的结果数? 我的意思是:
我有一个在字符串中获取sql查询的过程。 示例:
SELECT KolumnaA FROM Users WHERE KolumnaA > 5
我想指定此查询将返回多少结果的计数,并将其存储在变量中,但我不想实际执行查询。
我无法使用此解决方案:
EXECUTE sp_executesql @sql
SET @allCount = @@rowcount
因为它返回查询结果,除了获取返回行的计数。
答案 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
干杯。