在我们正在构建的应用程序中,在某些情况下,我们希望在仪表板上显示一组仅包含记录计数的指标。当用户点击这些指标时,我们希望显示这些记录。
大多数情况下,计数就足够了,所以我们不想查询数据库并返回实际记录以获取计数。有没有什么可以写一个可以利用相同选择的单个存储过程,但在一种情况下只计算计数,而在其他情况下返回实际记录?
答案 0 :(得分:4)
您可以通过设置参数并使用您的sproc中的if / case语句处理它来实现此目的。
Create procedure sptest_return (@CountOnly bit = 0)
As Begin
If @CountOnly = 0
Begin
Select * from test_table
End
Else
Begin
Select count(*) as [Count] from test_table
End
End
如果您将其称为 sptest_return ,则会返回所有行,如果您将其作为参数调用为 sptest_return 1 ,则只会显示行数
希望这有帮助。
答案 1 :(得分:0)
通过存储过程选择数据不是一个好主意。更好地使用UDF,最好使用单语句UDF。
在这种情况下,您可以通过调用
来选择数据SELECT * FROM dbo.YourFunction(Prm1, Prm2, ...)
这是一个巨大的财富,你也可以这样使用它:
SELECT COUNT(*) FROM (SELECT * FROM dbo.YourFunction(Prm1, Prm2, ...)) AS tbl
查询计划不会执行比查找正确计数所需的更多功能。使用存储过程,这是不可能的......
如果您必须遵守SP方法,请按照之前的建议进行操作。使用参数声明“GetCountOnly”或类似的东西。
HTH
答案 2 :(得分:0)
我认为SP返回不同的结果/多个结果是代码味道之一。因为您需要在运行时以不同的方式处理相同的SP,这很容易出错。
众所周知,SP可以返回一个int值,我们可以使用它:
CREATE sp_GetProjectData(@ReturnEmpty bit = 0)
AS
BEGIN
DECLARE @Count int = (SELECT COUNT(*) FROM Project)
-- Always return the table columns, but can be empty
SELECT * FROM Project WHERE @ReturnEmpty = 0
-- Return the count, always positive
RETURN @Count
END