2009-02-12 61 views
3

下面的語句有什麼問題?我不斷收到以下錯誤消息.... 服務器:消息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 
           ) 
       ) 
) 

回答

2

你有你的語句現在編碼就可以了(一旦你添加列參考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

看起來您的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))) 
4

我認爲你缺少你想在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

您的案例陳述沒有可用的對象。

你可以這樣做2種方式:

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