2016-12-04 15 views
2

所以這裏是存儲過程和我的執行代碼。SQL過程沒有提供參數和參數

消息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 
+0

備註:您應該**不要**爲存儲過程使用'sp_'前綴。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](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

我已經定義的存儲過程的參數時,和以前一樣,但我仍然面臨着同樣的問題,直到我意識到該程序有「創造」 「改變」的淚珠。改變它爲改變程序爲我工作(當我試圖調試時面對這個問題)。

相關問題