我正在开发一个框架,其中我是一个使用动态创建的参数调用存储过程。我正在运行时构建参数集合。
当我将参数传递给存储过程时,会出现此问题,但存储过程不接受此类参数。
例如,我的存储过程是:
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实现吗?任何帮助,非常感谢。谢谢
我在这里做了一点假设,但我假设过程中的逻辑通过任务被拆分。因为参数的动态性,你不能像@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时帮助调试/读取动态过程。)
为什么要将参数传递给不使用它的存储过程呢?
在我看来,您可能更擅长构建动态SQL语句,然后执行它们。您试图用SP做的事情是行不通的,即使您能够以这种方式改变您正在做的事情以适应不同数量的参数,您也将在本质上使用动态生成的SQL,这与您拥有/使用SP的初衷背道而驰。SP有其作用,但并不是所有情况下都有解决方案。
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不是字符串吗?