2011-03-11 42 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',但同样适用,因为这很容易用二进制表示。 –

相关问题