2013-03-03 151 views
23

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

当我将参数传递给存储过程时,会发生此问题,但存储过程不接受此类参数。

例如,我的存储过程是:

CREATE PROCEDURE GetTaskEvents 
    @TaskName varchar(50) 
AS 
BEGIN 
-- SP Logic 
END 

调用存储过程为:

EXEC GetTaskEvents @TaskName = 'TESTTASK', @ID = 2 

这将引发以下错误:

Msg 8144, Level 16, State 2, Procedure GetTaskEvents, Line 0 
Procedure or function GetTaskEvents has too many arguments specified. 

这工作正常,在Sybase ASE,它简单地忽略了任何附加参数。这可以通过MSSQL Server 2008来实现吗?任何帮助,非常感谢。谢谢

+0

你可以做EXEC GetTaskEvents'TESTTASK' – DevelopmentIsMyPassion 2013-03-03 22:15:26

回答

4

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

这听起来像你可能会更好地构建动态SQL语句,然后执行它们。你试图用SP做的事情是行不通的,即使你可以通过这种方式来改变你正在做的事情,以适应不同数量的参数,你基本上会使用动态生成的SQL,首先有/使用SP。 SP有其作用,但在所有情况下都没有解决方案。

27

SQL Server不允许您将参数传递给您尚未定义的过程。我认为你可以得到这种设计的最接近的是使用可选参数,像这样:

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

您需要包括,你可能在定义中使用每一个可能的参数。然后,你就可以自由调用程序两种方式:

EXEC GetTaskEvents @TaskName = 'TESTTASK', @ID = 2; 
EXEC GetTaskEvents @TaskName = 'TESTTASK'; -- @ID gets NULL here 
2

我要去有点假设在这里,但我假设的程序内部的逻辑被通过任务分割。由于参数的动态性,您不能设置@Yuck的可空参数吗?

我的假设,所以会

If TaskName = "Path1" Then Something

If TaskName = "Path2" Then Something Else

我最初的想法是,如果你有不同的功能与业务逻辑,你需要创建,并可以决定你有说5-10个不同的场景,而根据需要编写单独的存储过程,而不是尝试一种适合所有方法的巨大解决方案。可能会有点混乱维护。

但是如果你必须......

为什么不试试动态SQL,由@E.J Brennan(原谅我,我都没有碰过SQL在一段时间,所以我的语法可能是生锈的)话虽这么说,我不要的建议不知道它是否是最好的方法,但可以满足您的需求吗?

CREATE PROCEDURE GetTaskEvents 
    @TaskName varchar(50) 
    @Values varchar(200) 
AS 
BEGIN 
    DECLARE @SQL VARCHAR(MAX) 

    IF @TaskName = 'Something' 
    BEGIN 
    @SQL = 'INSERT INTO.....' + CHAR(13) 
    @SQL += @Values + CHAR(13) 
    END 

    IF @TaskName = 'Something Else' 
    BEGIN 
    @SQL = 'DELETE SOMETHING WHERE' + CHAR(13) 
    @SQL += @Values + CHAR(13) 
    END 

    PRINT(@SQL) 
    EXEC(@SQL)  
END 

(CHAR(13)增加了一个新行..一个旧习惯中我拿起地方,用来帮助调试/运行SQL事件探查器时,阅读动态过程 。)

0

请使用这样Exec的GetTaskEvents @paramOne,@parmTwo,@ParamN

1
CREATE PROCEDURE GetTaskEvents 
@TaskName varchar(50), 
@Id INT 
AS 
BEGIN 
-- SP Logic 
END 

程序呼叫

DECLARE @return_value nvarchar(50) 

EXEC @return_value = GetTaskEvents 
     @TaskName = 'TaskName', 
     @Id =2 

SELECT 'Return Value' = @return_value 
0

你combination.here你传递@TaskName =@ID代替@TaskName = .SP只有解析错误的参数需要一个参数。