2016-12-09 18 views
0

を更新するための手順/カーソルを保存変更:は、私は次のストアドプロシージャ持つテーブル

CREATE PROC FilmLength 
AS 
BEGIN 
DECLARE @Name CHAR(40) ,@Minutes INT 
DECLARE Filmcursor CURSOR 
     FOR (SELECT FilmName, FilmRunTimeMinutes from tblFilm) 

OPEN filmcursor 
FETCH NEXT FROM filmcursor INTO @Name, @Minutes 
WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    IF @Minutes < 120   PRINT (@Name + 'is a SHORT film') 
    ELSE IF @Minutes <150 PRINT (@Name + 'is a MEDIUM Length film') 
    ELSE       PRINT (@Name + 'is a LONG film') 
    FETCH NEXT FROM filmcursor INTO @Name, @Minutes 
END 
CLOSE filmcursor 
DEALLOCATE filmcursor 
END 

代わりの印刷を、私はそれが同じテーブルの列への短期、中期、長期のラベルを更新し、追加する必要がありますDurationという名前です私はSETにPRINTを変更しようとしましたが、それは通過しません。

これは私が使用していたものですが、それは通過しませんでした。私は(彼らは眉をひそめている)あなたのテーブルについて私に言ってきたし、それが列何に基づいて、カーソルを必要としない、

USE Movies 
GO 
ALTER PROC FilmLength 
AS 
BEGIN 
DECLARE @Minutes INT, @Duration Char(6) 
DECLARE Filmcursor CURSOR 
     FOR (SELECT FilmRunTimeMinutes, Duration from tblFilm) 

OPEN filmcursor 
FETCH NEXT FROM filmcursor INTO @Name, @Minutes 
WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    IF @Minutes < 120   SET @Duration = 'SHORT' 
    ELSE IF @Minutes <150  SET @Duration = 'MEDIUM' 
    ELSE      SET @Duration = 'LONG' 
    FETCH NEXT FROM filmcursor INTO @Name, @Minutes 
END 
CLOSE filmcursor 
DEALLOCATE filmcursor 
END 

答えて

0

オーケーを実行するために

Use Movies 
Execute FilmLength 
Select * 
from tblFilm 

を使用していましたこれは単純なupdate/caseステートメントではるかに簡単に行うことができます。

USE movies 

UPDATE tblfilm 
SET duration = (CASE 
         WHEN (filmruntime < 120) THEN 'SHORT' 
         WHEN (filmruntime BETWEEN 120 AND 150) THEN 'MEDIUM' 
         ELSE 'LONG' 
        END) 

SELECT * 
FROM tblfilm 

うまくいけば、これが必要なのです。私はあなたのテーブルの列が次の通りであると仮定しています。

FilmName VARCHAR(MAX)
FilmRunTime数値(18,0)
期間VARCHAR(MAX)

あなたの列のデータ型は、私に知らせて異なっている場合。

+0

これは私のために通っていないようでした。 –

+0

私の質問に多くの情報を追加しました。あなたのtblfilmテーブルの列名を知らなくても、私はちょうど推測しているので、コードを書くのは難しいです。 Peaseは、tblfilmの列のリストを提供します。 – Shaun

+0

別の考えでは、tblfilmに格納されている値を更新する必要があると言いました。これを複数回実行すると、値に「short、medium、Long」を追加し続けることになります。すでにこれらを更新しました。例えば、あなたのSPは日付を取り、XXXより大きい日付の値のみを更新するか、更新を実行した後にdatetime値を保持するupdatedwhenという名前の列があります。これがnullの場合はレコードを更新しますnullの場合は、nullでないレコードをスキップします。それは理にかなっていますか? – Shaun

関連する問題