当前位置: 首页 > 知识库问答 >
问题:

SQL Server存储过程参数

汤修贤
2023-03-14

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

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

例如,我的存储过程是:

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服务器2008实现吗?任何帮助,非常感谢。谢谢

共有3个答案

宰父阳焱
2023-03-14

我在这里做了一点假设,但我假设过程中的逻辑通过任务被拆分。因为参数的动态性,你不能像@Yuck建议的那样有可为空的参数?

所以按照我的假设

如果TaskName = "Path1 "那么

如果TaskName = "Path2 "则是其他东西

我最初的想法是,如果你有单独的函数和业务逻辑需要创建,你可以确定你有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

(字符(13)添加一个新行..这是我在某个地方找到的一个老习惯,用来在运行SQL profiler时帮助调试/读取动态过程。)

巢权
2023-03-14

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

在我看来,您可能更擅长构建动态SQL语句,然后执行它们。您试图用SP做的事情是行不通的,即使您能够以这种方式改变您正在做的事情以适应不同数量的参数,您也将在本质上使用动态生成的SQL,这与您拥有/使用SP的初衷背道而驰。SP有其作用,但并不是所有情况下都有解决方案

阎晋
2023-03-14

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

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
 类似资料:
  • 问题内容: 我有一张桌子,我需要在99%的时间内自动分配ID(其他1%似乎使用身份列来排除)。因此,我有一个存储过程来获取以下行中的下一个ID: `` 检查必须检查用户是否手动使用了ID并找到下一个未使用的ID。 当我依次调用它并返回1、2、3时,它可以正常工作。我需要做的是在多个进程同时调用此方法的情况下提供一些锁定。理想情况下,我只需要它专用于围绕此代码锁定last_auto_id表,以便第二

  • 问题内容: 我通过用户给定的参数对存储过程进行排序时遇到问题,我尝试阅读,但是尝试过的解决方案不起作用。 那么,有人可以帮助我吗?我希望可以从Group_concat中按类型对它进行排序。如果我以Harcoded形式输入它(例如,ORDER BY Type1,ORDER BY Type2等),它将起作用。但是我想要这样的东西(ORDER BY @specificStat)。 问题答案: 改用这个:

  • 问题内容: 我一直在寻找如何从经典的asp调用存储过程并将参数传递给它的方法,这是我的存储过程,可以正常工作 和到目前为止的我的vbscript代码- 问题答案: 您正在寻找Parameters属性。 哦,劳迪,我又在写VBScript。

  • 本文向大家介绍sqlserver中存储过程的递归调用示例,包括了sqlserver中存储过程的递归调用示例的使用技巧和注意事项,需要的朋友参考一下 递归式指代码片段调用自身的情况;危险之处在于:如果调用了自身一次,那么如何防止他反复地调用自身。也就是说提供递归检验来保证适当的时候可以跳出。 以阶层为例子说存储过程中递归的调用。 递归 当创建此存储过程时候,会遇见一条报告信息

  • 问题内容: 我有一个来自此(google book )的mysql存储过程,一个例子是这样的: 该程序编译正常。(我在ubuntu中使用MySQL查询浏览器)。 但是,当我调用该过程时: (也在查询浏览器中) 它返回一个错误: 为什么这个例子不起作用? 问题答案: 无法复制。对我来说效果很好: 也许您应该粘贴整个错误消息,而不是对其进行汇总。

  • 问题内容: 我在我的应用程序中收到一个错误,我不知道如何解决它。这是代码: 我收到的错误是与。它说 InvalidCastException无法将参数值从任务转换为字符串。 我认为这与我尝试放置位置有关(在if语句内部),但我不确定。任何帮助将非常感激。 谢谢, 马特 问题答案: 我的猜测是 t不是字符串吗?