Jon*_*Doe 1 sql-server stored-procedures execute
所以这是存储过程和执行的代码.当我尝试执行命令时,我不断收到此消息:
消息8146,级别16,状态2,过程sp_LabelFilm,行0
过程sp_LabelFilm没有提供参数和参数.
知道为什么吗?我正在尝试更新表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
Run Code Online (Sandbox Code Playgroud)
错误意味着它所说的.你传递的是参数(变量@minutes和@duration),但是在存储过程中没有定义参数.
要声明参数(输入变量),你实际上在它们之前声明它们,AS所以:
use Movies
go
alter PROC [dbo].[sp_LabelFilm]
@Minutes INT
,@duration CHAR(10)
AS
BEGIN
DECLARE Filmcursor CURSOR
......
Run Code Online (Sandbox Code Playgroud)
请注意,您不需要使用关键字DECLARE,一旦它们被声明为参数,您实际上不需要再次声明它们.
接下来我不完全确定你试图用存储过程中的参数完成什么,但它实际上看起来你不想传递它们,而是你想让它们像输出那样:
use Movies
go
alter PROC [dbo].[sp_LabelFilm]
@Minutes INT OUTPUT
,@duration CHAR(10) OUTPUT
AS
BEGIN
DECLARE Filmcursor CURSOR
....
Run Code Online (Sandbox Code Playgroud)
你的执行语句看起来像这样:
declare @Minutes INT, @duration char(10)
execute [dbo].[sp_LabelFilm] @minutes = @Minutes OUTPUT, @duration = @duration OUTPUT
Run Code Online (Sandbox Code Playgroud)