Ошибка синтаксиса - PullRequest
       20

Ошибка синтаксиса

3 голосов
/ 12 февраля 2009

Что не так с утверждением ниже? Я продолжаю получать следующее сообщение об ошибке .... Сервер: сообщение 156, уровень 15, состояние 1, строка 4 Неверный синтаксис рядом с ключевым словом THEN.

update oildatasetstatus
set oildatasetstatusid = 
    case 
    WHEN 5 THEN 16        
    WHEN 6 THEN 17        
    WHEN 7 THEN 18        
    WHEN 8 THEN 18        
    WHEN 9 THEN 18        
    WHEN 10 THEN 19        
    WHEN 11 THEN 20    
    End
where oildatasetlabstatusid in 
(
                select oildatasetstatusid
                from OilDataSetStatus
                inner join OilDataSet on OilDataSet.OilDataSetID = 
                    OilDataSetStatus.OilDataSetID
                where SamplePointID in 
                (
                                select SamplePointID 
                                from SamplePoint
                                where CustomerSiteID in
                                (
                                                select CustomerSiteID
                                                from CustomerSite
                                                where CustomerID = 2
                                )
                )
)

Ответы [ 4 ]

4 голосов
/ 12 февраля 2009

Я думаю, что вы пропустили утверждение, которое хотите оценить в утверждении CASE.

update oildatasetstatus set oildatasetstatusid =
case oildatasetstatusid
 WHEN 5 THEN 16
 WHEN 6 THEN 17
 WHEN 7 THEN 18
 WHEN 8 THEN 18
 WHEN 9 THEN 18
 WHEN 10 THEN 19
 WHEN 11 THEN 20
End
where oildatasetlabstatusid in ( select oildatasetstatusid from OilDataSetStatus inner join OilDataSet on OilDataSet.OilDataSetID = OilDataSetStatus.OilDataSetID where SamplePointID in ( select SamplePointID from SamplePoint where CustomerSiteID in ( select CustomerSiteID from CustomerSite where CustomerID = 2 ) ) )

Дайте это выстрел?

3 голосов
/ 12 февраля 2009

У вашего оператора case нет объекта для работы.

Вы можете сделать это двумя способами:

set oildatasetstatusid = 
    case oildatasetstatusid
    WHEN 5 THEN 16        
    WHEN 6 THEN 17        
    WHEN 7 THEN 18        
    WHEN 8 THEN 18        
    WHEN 9 THEN 18        
    WHEN 10 THEN 19        
    WHEN 11 THEN 20    
    End

или

set oildatasetstatusid = 
    case 
    WHEN oildatasetstatusid = 5 THEN 16        
    WHEN oildatasetstatusid = 6 THEN 17        
    WHEN oildatasetstatusid = 7 THEN 18        
    WHEN oildatasetstatusid = 8 THEN 18        
    WHEN oildatasetstatusid = 9 THEN 18        
    WHEN oildatasetstatusid = 10 THEN 19        
    WHEN oildatasetstatusid = 11 THEN 20    
    End
2 голосов
/ 13 февраля 2009

Способ работы вашего оператора теперь будет работать (однако, как только вы добавите ссылку на столбец в оператор case, как было упомянуто в других публикациях), если позволить остальному синтаксису остаться без комментариев, это будет плохой услугой для других. в вашей ситуации.

Хотя вам может потребоваться выполнить этот запрос только один раз, я и другие сталкивались с подобными ситуациями, когда Update для нескольких строк также полагается на таблицы данных 3 или 4 вне нашего источника и должно выполняться много раз ( как в отчете).

Свернув ваши подвыборки в один оператор select и сохранив результаты этого в таблицу #Temp или переменную @Table, вам нужно выполнить этот поиск только один раз, а затем выбрать из набора результатов для ваше обновление.

Вот пример использования переменной @table:

declare @OilStatus table (oilDatasetStatusID int)
insert into @OilStatus
    select odss.oildatasetstatusid
    from OildataSetStatus odss
    join oilDataSet ods on ods.OilDataSetID = odss.OilDataSetID
    join SamplePoint sp on sp.SamplePointID = odss.SamplePointID
    join CustomerSite cs on cs.CustomerSiteID = sp.CustomerSiteID
    where cs.CustomerID = 2

update oildatasetstatus
set oildatasetstatusid = 
    case oildatasetstatusid
        WHEN 5 THEN 16        
        WHEN 6 THEN 17        
        WHEN 7 THEN 18        
        WHEN 8 THEN 18        
        WHEN 9 THEN 18        
        WHEN 10 THEN 19        
        WHEN 11 THEN 20    
end
where oildatasetlabstatusid in ( select oilDatasetStatusID from @OilStatus )

Поскольку у меня нет вашей точной схемы, могут быть ошибки при попытке реализовать приведенный выше пример, но я думаю, вы поймете эту идею.

Кроме того, всякий раз, когда несколько таблиц используются в одном операторе, старайтесь предварять каждое имя столбца псевдонимом или полным именем таблицы. Это помогает предотвратить потерю движка sql и людей, читающих ваш код.

2 голосов
/ 12 февраля 2009

Похоже, ваш оператор case должен указать, какой столбец проверяется на заданное значение.

Например:

 update  oildatasetstatus
    set     oildatasetstatusid = case WHEN oildatasetstatusid = 5 THEN 16
                                      WHEN oildatasetstatusid = 6 THEN 17
                                      WHEN oildatasetstatusid = 7 THEN 18
                                      WHEN oildatasetstatusid = 8 THEN 18
                                      WHEN oildatasetstatusid = 9 THEN 18
                                      WHEN oildatasetstatusid = 10 THEN 19
                                      WHEN oildatasetstatusid = 11 THEN 20
                                 End
    where   oildatasetlabstatusid in (
            select  oildatasetstatusid
            from    OilDataSetStatus
                    inner join OilDataSet on OilDataSet.OilDataSetID = OilDataSetStatus.OilDataSetID
            where   SamplePointID in (
                    select  SamplePointID
                    from    SamplePoint
                    where   CustomerSiteID in ( select  CustomerSiteID
                                                from    CustomerSite
                                                where   CustomerID = 2 ) ) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...