SQL Server存储过程参数

Nar*_*ade 28 sql stored-procedures optional-parameters sql-server-2008

我正在开发一个框架,其中我是一个动态创建参数的调用存储过程.我正在运行时构建参数集合.

当我将参数传递给存储过程时,会出现问题,但存储过程不接受此类参数.

例如,我的存储过程是:

CREATE PROCEDURE GetTaskEvents
    @TaskName varchar(50)
AS
BEGIN
-- SP Logic
END
Run Code Online (Sandbox Code Playgroud)

将存储过程称为:

EXEC GetTaskEvents @TaskName = 'TESTTASK', @ID = 2
Run Code Online (Sandbox Code Playgroud)

这会抛出以下错误:

Msg 8144, Level 16, State 2, Procedure GetTaskEvents, Line 0
Procedure or function GetTaskEvents has too many arguments specified.
Run Code Online (Sandbox Code Playgroud)

这在Sybase ASE中运行良好,它只是忽略任何其他参数.这可以用MSSQL server 2008实现吗?任何帮助,非常感谢.谢谢

Yuc*_*uck 39

SQL Server不允许您将参数传递给尚未定义的过程.我认为最接近这种设计的方法是使用可选参数,如下所示:

CREATE PROCEDURE GetTaskEvents
    @TaskName varchar(50),
    @ID int = NULL
AS
BEGIN
-- SP Logic
END;
Run Code Online (Sandbox Code Playgroud)

您需要包含可能在定义中使用的每个可能参数.然后您可以自由地调用该过程:

EXEC GetTaskEvents @TaskName = 'TESTTASK', @ID = 2;
EXEC GetTaskEvents @TaskName = 'TESTTASK'; -- @ID gets NULL here
Run Code Online (Sandbox Code Playgroud)


E.J*_*nan 7

为什么要将参数传递给不使用它的存储过程?

听起来对你来说,你可能更善于构建动态SQL语句然后执行它们.你试图用SP做什么是行不通的,即使你可以改变你正在做的事情以适应不同数量的参数,你基本上会使用动态生成的SQL来破坏你的目的.首先拥有/使用SP.SP有一个角色,但在所有情况下都没有解决方案.