2011-03-11 17 views
2

と呼ばれることは決してありませんかどうかを確認することはできません。T-SQLは:私はこのようなテーブル持っている理由句は

CREATE TABLE [dbo].[Scores](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Score] [float] NULL, 
CONSTRAINT [PK_Scores] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

をそして、私はいくつかのINSERT

INSERT INTO Scores (Score) VALUES (0.5) 
INSERT INTO Scores (Score) VALUES (2) 
INSERT INTO Scores (Score) VALUES (3) 
INSERT INTO Scores (Score) VALUES (4.5) 

を持ってそれから私は私がすべて変更する必要があることを実現しますスコアは0.5が2などになるはずです。 だから私はそれを手助けするためにカーソルを使用します。あなたがよりよい解決策を提案する前に

DECLARE @id int 
DECLARE @score float 
DECLARE myCursor CURSOR LOCAL FAST_FORWARD FOR  

SELECT Id, Score  
FROM [dbo].[Scores] 
OPEN myCursor FETCH NEXT FROM myCursor INTO @id, @score 
WHILE @@FETCH_STATUS = 0 
BEGIN  
    PRINT 'Id: ' PRINT @id  
    PRINT 'Score: ' PRINT @score  
    -- do your tasks here  
    FETCH NEXT FROM myCursor INTO @id, @score 

    IF @score = 2 
    BEGIN 
     UPDATE Scores set Score = 3.0 WHERE Id = @id 
    END 
    IF @score = 3 
    BEGIN 
     UPDATE Scores set Score = 4.0 WHERE Id = @id 
    END 
    IF @score = 0.5 
    BEGIN 
     UPDATE Scores set Score = 2.0 WHERE Id = @id 
    END 
    IF @score = 4.5 
    BEGIN 
     UPDATE Scores set Score = 5.0 WHERE Id = @id 
    END 
END 
CLOSE myCursor DEALLOCATE myCursor 

、私に教えてくださいなぜ この行が呼ばれることは決してありません:このよう

UPDATE Scores set Score = 2.0 WHERE Id = @id 

答えて

4
Update Scores 
Set Score = 
    case 
    when Score = 0.5 then 2 
    when Score = 4.5 then 5 
    --etc... 
    else Score 
    end; 

編集:申し訳ありませんが、それのポイントを逃しました。

フェッチが間違っているためです。 カーソルループの下部に

FETCH NEXT FROM myCursor INTO @id, @score 

を入れてください。行1をループの外に1回、もう一度先頭に戻します(値を出力した後)。

+0

"より良いソリューションを提案する前に、なぜこの行がなぜ呼び出されないのかを教えてください。" –

+0

..... ..... – DaveShaw

+0

SQLには最適化とカーソルの問題があります。カーソルの明示的な理由がない場合は、私が掲示した更新とケースの解決方法に固執します。 – DaveShaw

0

丸め誤差が考えられます。浮動小数点ではなく小数点の列(および変数)としてScoreを宣言しようとするとどうなりますか?

+0

「2」という数字には問題はありません。 –

+0

実際、テストは 'IF @score = 0.5'ではなく' 2'ですが、これはバイナリで簡単に表現できるので同じです。 –

関連する問題