T-sql: не могу понять, почему предложение IF никогда не вызывается - PullRequest
2 голосов
/ 12 марта 2011

У меня есть такая таблица:

    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 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

Ответы [ 2 ]

4 голосов
/ 12 марта 2011
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 голосов
/ 12 марта 2011

Ошибка округления возможна. Что произойдет, если вы попытаетесь объявить Score как десятичный столбец (и переменную), а не как число с плавающей точкой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...