带有可选参数的存储过程限制返回的行(如果指定)

Ωme*_*Man 1 sql-server stored-procedures azure-sql-database top

如何拥有一个允许消费者有选择地指定返回行数的存储过程?

如果未指定行数,则返回所有行。

Eri*_*ing 5

“最简单”的方法是参数化 TOP 的输入。我使用的数字是 BIGINT 的最大值。您可能永远不会拥有比查询返回的行数更多的行。

USE master
GO 

CREATE PROCEDURE dbo.Limiter (@Top BIGINT = 9223372036854775807)
AS
BEGIN

SELECT TOP (@Top) *
FROM sys.databases

END

EXEC dbo.Limiter @Top = 1

EXEC dbo.Limiter 
Run Code Online (Sandbox Code Playgroud)

请小心,因为您可以在此处引入参数嗅探症状。

如果您查看这两者的计划,就会发现两者的 TOP 运算符都期望 one row

无论 top 的哪个输入首先执行,都将被缓存,除非您重新编译或添加 OPTIMIZE FOR 提示。

您还应该意识到添加 TOP 运算符可能会引入行目标