2016-12-04 3 views
2

Итак, вот код хранимой процедуры и моего выполнения. Я получаю это сообщение, когда я пытаюсь выполнить мою команду:SQL-процедура не содержит параметров и аргументов

Msg 8146, Level 16, State 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 
+0

Сторона примечания: вы не должны ** использовать префикс 'sp_' для хранимых процедур. Microsoft [зарезервировала этот префикс для собственного использования (см. * Именование сохраненных процедур *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) и вы рискуете столкнуться с именем когда-нибудь в будущем. [Это также плохо для производительности вашей хранимой процедуры] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Лучше просто просто избегать 'sp_' и использовать что-то еще в качестве префикса - или никакого префикса вообще! –

ответ

7

ошибка означает то, что она говорит. То, что вы передаете аргументы (переменные @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 
0

Я определил параметры на хранимой процедуре, перед AS, но все же я столкнулся с той же проблемой, пока я не понял, что процедура «создала» тиад «альтер». Меня это изменило, чтобы изменить процедуру. (Столкнулся с этой проблемой, пока я пытался отлаживать).