2009-02-12 9 views
3

Quel est le problème avec l'instruction ci-dessous? Je continue d'obtenir le message d'erreur suivant .... Serveur: Msg 156, niveau 15, état 1, ligne 4 Syntaxe incorrecte près du mot clé "THEN".Erreur de syntaxe

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

Répondre

2

La façon dont vous avez votre déclaration code maintenant fonctionnera (une fois que vous ajoutez la référence de colonne à la déclaration de cas, comme mentionné par d'autres messages), cependant, laisser le reste de votre syntaxe ne pas être commenté serait un mauvais service pour les autres dans votre situation.

Bien que vous ne deviez exécuter cette requête qu'une fois, moi et d'autres avons rencontré des situations similaires où Update à plusieurs lignes dépend également des données à 3 ou 4 tables de notre source et doit être exécuté plusieurs fois (comme dans un rapport).

En regroupant vos sous choisit en une seule instruction select et enregistrer les résultats de ce dans une table #Temp ou une variable @Table, il suffit de le faire référence une fois, puis sélectionnez le résultat de votre mise à jour.

Voici un échantillon en utilisant une variable @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) 

Depuis que je n'ai pas votre schéma exact, il peut y avoir des erreurs en essayant de mettre en œuvre l'exemple ci-dessus, mais je pense que vous aurez l'idée.

De même, lorsque plusieurs tables sont utilisées dans une seule instruction, essayez de préfacer chaque nom de colonne avec un alias ou le nom complet de la table. Cela aide à garder le moteur SQL et les personnes lisant votre code de se perdre.

2

On dirait que votre instruction case doit spécifier quelle colonne est testée pour la valeur donnée.

Par exemple:

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

Je pense que vous manquez la déclaration que vous voulez évaluer dans l'instruction 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))) 

Donnez-vous un coup de feu?

3

Votre requête n'a pas d'objet de travail.

Vous pouvez le faire de 2 façons:

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 

ou

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