2016-12-04 3 views
2

그래서 여기에 저장 프로 시저와 실행을위한 코드가 있습니다. 0
절차 sp_LabelFilm이 매개 변수가없는 및 ​​인수가 제공되었다SQL 프로 시저에 매개 변수가 없으며 인수가 제공되었습니다

메시지 8146, 수준 16, 상태 2, 프로 시저 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

나는 이전, 저장 프로 시저에 대한 매개 변수를 정의했지만, 나는 실현 될 때까지 여전히 같은 문제에 직면했다 프로 시저에 '작성'기능이 있음 '변경'의 tead. 프로 시저를 변경하기 위해 그것을 변경하면 나를 위해 일했습니다. (디버깅을 시도하는 동안이 문제가 발생했습니다.)