2011-01-28 1 views
0

Je me suis battu avec cette requête pendant 2 jours et je ne trouve toujours pas où le problème est.Msg 102, niveau 15, état 1, ligne 15 Syntaxe incorrecte près de ')'

La requête SQL est comme ceci:

select t2.transno, 
    case 
    when (Select Count (*) 
     From v1 
     where v1.transno < v1.transno) > 1 
    then (
    case 
    when (Select Top 1 v1.transno 
      From v1 
      Where v1.transno < v1.transno 
      Order By v1.transno Desc)=(T2.transno-1) 
    then ' ' 
    else 'Missing Invoice') 
    else '' 
    end AS Marker 
FROM v1 AS T2 

Il me donne un message d'erreur:

Msg 102, Level 15, State 1, Line 15 Incorrect syntax near ')'. 
+0

Je pense que vous feriez mieux de nous donner des tableaux, des données et la sortie désirée . Vous avez 2 sous-requêtes corrélées par ligne dans SELECT, ce qui signifie une mauvaise performance. si c'est rapide, c'est parce que l'optimiseur réalise v1.transno gbn

+0

Son pour vérifier la séquence du numéro de facture, et si un numéro est manquant alors il affichera la facture manquante dans la colonne marqueur.Je l'ai fait dans l'accès cela fonctionne bien mais quand je change la syntaxe pour l'exécuter dans SQL Server 2005 alors j'obtiens erreur – Monshine

Répondre

0

Votre deuxième déclaration de cas il manque une fin, dont elle a besoin. Essayez ceci:

select t2.transno, 
    case 
    when (Select Count (*) 
     From v1 
     where v1.transno < v1.transno) > 1 
    then (
    case 
    when (Select Top 1 v1.transno 
      From v1 
      Where v1.transno < v1.transno 
      Order By v1.transno Desc)=(T2.transno-1) 
    then ' ' 
    else 'Missing Invoice') end 
    else '' 
    end AS Marker 
FROM v1 AS T2 
1

Je suppose que vous oubliez de mettre fin dans cette déclaration: else 'Missing Invoice') Essayez comme else 'Missing Invoice') end

select t2.transno, 
    case 
    when (Select Count (*) 
     From v1 
     where v1.transno < v1.transno) > 1 
    then (
    case 
    when (Select Top 1 v1.transno 
      From v1 
      Where v1.transno < v1.transno 
      Order By v1.transno Desc)=(T2.transno-1) 
    then ' ' 
    else 'Missing Invoice' 
    end) 
    else '' 
    end AS Marker 
FROM v1 AS T2 
+0

J'ai essayé votre suggestion, mais obtenir cette erreur.Msg 4104, Niveau 16, État 1, Ligne 34 L'identifiant en plusieurs parties " t2.transno "ne pouvait pas être lié. – Monshine

+0

@Monshine: les noms de tables sont-ils sensibles à la casse? Essayez de changer 't2' en' T2'. –

0

Je ne sais pas si cela est la réponse, mais je pense que Top 1 devrait être Top (1). (See here)

0

v1.transno < v1.transno est toujours faux = zéro rangées.

Ainsi, votre requête peut être réécrite comme

SELECT v1.transno, 'Missing Invoice' AS Marker FROM v1 

Plus sérieusement, il peut être exprimé plus simplement

select t2.transno, 
    case 
     when foo.maxtransno IS NULL THEN 'Missing Invoice' 
     ELSE ' ' 
    END AS Marker 
FROM 
    v1 AS T2 
    OUTER APPLY 
    (Select MAX(v1.transno) AS maxtransno 
      From v1 
      Where v1.transno < t2.transno 
      HAVING MAX(v1.transno) = T2.transno-1 
    ) foo 
+0

Désolé suis quelque chose de nouveau à SQL Server.J'ai essayé votre solution, mais il dit Msg 4104, Niveau 16, État 1, Ligne 50 L'identificateur en plusieurs parties "t2.transno" ne pouvait pas être lié.Désolé pour paraître stupide mais quel est le "foo" mean.Do je dois le remplacer? – Monshine

Questions connexes