2011-03-11 46 views
2

我有這樣的一個表:T-SQL:不明白爲什麼IF子句不會被調用

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,並再次在頂部(但打印出值後)。

+0

」在您提出更好的解決方案之前,請告訴我爲什麼這行永遠不會被調用:「 –

+0

更新..... :) – DaveShaw

+0

儘管SQL在優化和遊標時遇到困難。如果你沒有任何明確的遊標理由,我會堅持我發佈的更新和案例解決方案。 – DaveShaw

0

舍入誤差是一種可能性。如果您嘗試將Score作爲小數列(和變量)而不是浮點數,會發生什麼? 「

+0

我不會想到這個問題'2號'我會想到。 –

+0

實際上測試是'IF @score = 0.5'而不是'2',但同樣適用,因爲這很容易用二進制表示。 –

相關問題