SQL 过程没有参数并且提供了参数
SQL Procedure has no parameters and arguments were supplied
这是存储过程和我执行的代码。当我尝试执行我的命令时,我不断收到此消息:
Msg 8146, Level 16, State 2, Procedure sp_LabelFilm, Line 0
Procedure sp_LabelFilm has no parameters and arguments were supplied.
知道为什么吗?我正在尝试更新 table tblfilm 中的一列,以根据电影的 运行 时间判断电影是短片、中片还是长片。
ALTER PROCEDURE [dbo].[sp_LabelFilm]
AS
BEGIN
DECLARE @Minutes INT, @duration char(10)
DECLARE Filmcursor CURSOR FOR
(SELECT filmruntimeminutes, Duration FROM tblFilm)
OPEN filmcursor
FETCH NEXT FROM filmcursor INTO @duration
WHILE (@@FETCH_STATUS = 0)
BEGIN
SELECT @Minutes = FilmRunTimeMinutes FROM tblFilm
IF @Minutes < 120
SET @duration = 'short'
ELSE IF @Minutes < 150
SET @duration = 'medium'
ELSE
SET @duration = 'long'
FETCH NEXT FROM filmcursor INTO @duration
UPDATE tblFilm
SET Duration = @duration
END
CLOSE filmcursor
DEALLOCATE filmcursor
END
DECLARE @Minutes INT, @duration CHAR(10)
EXECUTE [dbo].[sp_LabelFilm] @minutes, @duration
错误的意思正是它所说的。您正在传递参数(变量 @minutes
和 @duration
)但存储过程中没有定义任何参数。
要声明参数(输入变量),您实际上是在 AS
之前声明它们,如下所示:
use Movies
go
alter PROC [dbo].[sp_LabelFilm]
@Minutes INT
,@duration CHAR(10)
AS
BEGIN
DECLARE Filmcursor CURSOR
......
请注意,您不需要使用关键字 DECLARE
,一旦将它们声明为参数,您实际上不需要再次声明它们。
接下来我不完全确定你试图用存储过程中的参数完成什么,但实际上看起来你不想传递它们,而是想将它们作为输出来获取,这将是像这样:
use Movies
go
alter PROC [dbo].[sp_LabelFilm]
@Minutes INT OUTPUT
,@duration CHAR(10) OUTPUT
AS
BEGIN
DECLARE Filmcursor CURSOR
....
您的执行语句如下所示:
declare @Minutes INT, @duration char(10)
execute [dbo].[sp_LabelFilm] @minutes = @Minutes OUTPUT, @duration = @duration OUTPUT
我已经在 AS 之前定义了存储过程的参数,但我仍然面临同样的问题,直到我意识到该过程具有 'create' 而不是 'alter'。更改它以改变程序对我有用。(我在尝试调试时遇到了这个问题)。
除了第一个答案是恰当的——在我的例子中,我没有任何参数,而 EXEC 遇到了类似的错误。
但是不同之处在于 - 我在 EXEC 语句下面放了一个 "go"。
删除 go 后它被正确执行。
这是存储过程和我执行的代码。当我尝试执行我的命令时,我不断收到此消息:
Msg 8146, Level 16, State 2, Procedure sp_LabelFilm, Line 0
Procedure sp_LabelFilm has no parameters and arguments were supplied.
知道为什么吗?我正在尝试更新 table tblfilm 中的一列,以根据电影的 运行 时间判断电影是短片、中片还是长片。
ALTER PROCEDURE [dbo].[sp_LabelFilm]
AS
BEGIN
DECLARE @Minutes INT, @duration char(10)
DECLARE Filmcursor CURSOR FOR
(SELECT filmruntimeminutes, Duration FROM tblFilm)
OPEN filmcursor
FETCH NEXT FROM filmcursor INTO @duration
WHILE (@@FETCH_STATUS = 0)
BEGIN
SELECT @Minutes = FilmRunTimeMinutes FROM tblFilm
IF @Minutes < 120
SET @duration = 'short'
ELSE IF @Minutes < 150
SET @duration = 'medium'
ELSE
SET @duration = 'long'
FETCH NEXT FROM filmcursor INTO @duration
UPDATE tblFilm
SET Duration = @duration
END
CLOSE filmcursor
DEALLOCATE filmcursor
END
DECLARE @Minutes INT, @duration CHAR(10)
EXECUTE [dbo].[sp_LabelFilm] @minutes, @duration
错误的意思正是它所说的。您正在传递参数(变量 @minutes
和 @duration
)但存储过程中没有定义任何参数。
要声明参数(输入变量),您实际上是在 AS
之前声明它们,如下所示:
use Movies
go
alter PROC [dbo].[sp_LabelFilm]
@Minutes INT
,@duration CHAR(10)
AS
BEGIN
DECLARE Filmcursor CURSOR
......
请注意,您不需要使用关键字 DECLARE
,一旦将它们声明为参数,您实际上不需要再次声明它们。
接下来我不完全确定你试图用存储过程中的参数完成什么,但实际上看起来你不想传递它们,而是想将它们作为输出来获取,这将是像这样:
use Movies
go
alter PROC [dbo].[sp_LabelFilm]
@Minutes INT OUTPUT
,@duration CHAR(10) OUTPUT
AS
BEGIN
DECLARE Filmcursor CURSOR
....
您的执行语句如下所示:
declare @Minutes INT, @duration char(10)
execute [dbo].[sp_LabelFilm] @minutes = @Minutes OUTPUT, @duration = @duration OUTPUT
我已经在 AS 之前定义了存储过程的参数,但我仍然面临同样的问题,直到我意识到该过程具有 'create' 而不是 'alter'。更改它以改变程序对我有用。(我在尝试调试时遇到了这个问题)。
除了第一个答案是恰当的——在我的例子中,我没有任何参数,而 EXEC 遇到了类似的错误。
但是不同之处在于 - 我在 EXEC 语句下面放了一个 "go"。
删除 go 后它被正确执行。