简体   繁体   English

在关键字“ WHERE”附近查找语法错误的原因

[英]Finding the cause of Incorrect syntax near the keyword 'WHERE'

I have the following error from SQL Server: 我从SQL Server中收到以下错误:

Msg 156, Level 15, State 1, Incorrect syntax near the keyword 'WHERE'. 消息156,级别15,状态1,关键字“ WHERE”附近的语法错误。

SELECT DISTINCT
       cpt.Cpt_id AS ID_Entreprise,
       enta.entApp,
       enta.entJuri,
       cli.RaisocA,
       cli.RaisocB,
       cli.AdresA,
       cli.AdresB,
       cli.Cpostal,
       cli.Burdist,
       ins.Site_id,
       ins.Inscrip_id,
       '' AS CdGraReg,
       '' AS CaisseSS,
       '' AS CentreSS,
       cpt.Login,
       cli.RaisocB AS Raisoc,
       ct.Entappcr,
       ct.Cont,
       ct.Souscont,
       ct.Sptf,
       ctcb.Socuti,
       (CASE
             WHEN ct.typepdt = 'R' THEN (CASE WHEN (ctcb.entjuriais IS NULL OR ctcb.entjuriais = '') THEN 'E' ELSE 'R' END)
             ELSE ct.typepdt
        END) AS typepdt,
       ct.Scont,
       ct.Siret,
       ctcb.Datefcb,
       ctcb.Dtfineffcb,
       ctcb.Stacb,
       ctcb.Libstacb,
       ctcb.Perap,
       ctcb.Libperap,
       ctcb.Deremis,
       ctcb.Derregl,
       ISNULL(EntTPG.EntiteTPG, '') AS EntiteTPG,
       CASE ct.Typepdt
            WHEN 'R' THEN CASE ISNULL(RegRet.Reg, 0)WHEN 0 THEN 0 ELSE 1 END
            WHEN 'I' THEN CASE ISNULL(RegIFC.Reg, 0)WHEN 0 THEN 0 ELSE 1 END
            ELSE 0
       END AS UC,
       CASE ct.Typepdt
            WHEN 'R' THEN CASE ISNULL(RegRet.Reg, 0)WHEN 0 THEN 0 ELSE RegRet.isArt39 END
            ELSE 0
       END AS Art39,
       ctcb.Cb,
       ctcb.Cnt_bo_ve_actif,
       ct.Sta,
       ct.Libsta,
       ct.Dateff,
       ctcb.Date_hors_infocentre AS Date_hors_infocentre_CtCb,
       CASE WHEN RegMens.reg IS NULL THEN 0 ELSE 1 END AS mensualisation,
       CASE WHEN RegRep.reg IS NULL THEN 0 ELSE 1 END AS repartition,
       CASE WHEN RegOptFin.reg IS NULL THEN 0 ELSE 1 END AS optFin,
       ctcb.Socuti,
       ctcb.Libcb,
       (CASE ct.typepdt
             WHEN 'S' THEN '1'
             WHEN 'P' THEN '2'
             WHEN 'R' THEN '3'
             WHEN 'I' THEN '4'
             ELSE '5'
        END) AS orderParam,
       ct.Reg,
       ctcb.Cnt_bo_affil_sal,
       ctcb.Cnt_bo_affil_sal AS affilSalEnabled,
       ct.Siret,
       ISNULL(ctcb.AtOperationnel, 'N') AS AtOperationnel,
       ctcb.Formule,
       ctcb.FormuleSocle,
       ctcb.Srs,
       ctcb.Libstacb_vision_C,
       ct.DATENVOI,
       ct.DATREGUL,
       ct.DATPA,
       ctcb.Cnt_bo_vs_actif,
       ctcb.Vision AS Vision_Ctcb,
       ct.Vision AS Vision_Ct,
       ctcb.Valide AS Valide_Ctcb,
       ctcb.Valide_C,
       ct.ent_opt_set,
       ctcb.Cntcb_actif,
       ct.Cnt_actif,
       ctcb.Cntcb_actif,
       ct.CodeICX,
       ct.AppLeader
FROM  dbo.Inscription_site ins INNER JOIN
      dbo.Clients cli ON cli.Siret = ins.Siret INNER JOIN
      dbo.Comptes_cli cpt ON cpt.Inscrip_id = ins.Inscrip_id INNER JOIN
      dbo.ENTAPP enta ON enta.entApp = ins.Entappcr INNER JOIN
      dbo.Contratscb ctcb INNER JOIN
      dbo.Contrats ct ON ctcb.Scont = ct.Scont AND ctcb.Siret = ct.Siret LEFT OUTER JOIN
      dbo.Asso_SocUti_ENTTPG EntTPG ON EntTPG.Socuti = ctcb.Socuti LEFT OUTER JOIN
      dbo.Regime_IdentificationContratsRetraiteUC RegRet ON RegRet.Reg = ct.Reg LEFT OUTER JOIN
      dbo.Regime_IdentificationContratsIFCUC RegIFC ON RegIFC.Reg = ct.Reg LEFT OUTER JOIN
      dbo.Regime_Mensualisation RegMens ON RegMens.Reg = ct.Reg LEFT OUTER JOIN
      dbo.Regime_Repartition RegRep ON RegRep.Reg = ct.Reg LEFT OUTER JOIN
      dbo.Regime_OptionFinanciere RegOptFin ON RegOptFin.Reg = ct.Reg LEFT OUTER JOIN
      dbo.Regime_ERE RegERE ON RegERE.Reg = ct.Reg
WHERE (ctcb.Stacb NOT IN ('30', '31', '35', '39')) AND (ct.Sta <> '30')

underline "where" but i don't know why 下划线“哪里”,但我不知道为什么

The on clause is missing: 缺少on子句:

INNER JOIN
      dbo.Contratscb ctcb INNER JOIN

Parsers tend to give you error messages, but they are less than perfect. 解析器通常会向您提供错误消息,但它们并不完美。 Sometimes they are unable to show you exactly where your syntax error is, and instead report the end of the block where an error in parsing exists. 有时,他们无法向您确切显示语法错误的位置,而是报告存在解析错误的块的末尾。

In your case, when the parser gets to the WHERE part it realises the block preceding it has an error and reports that location. 在您的情况下,当解析器到达WHERE部分时,它意识到它前面的块有错误并报告该位置。

The error is you forgot to qualify the INNER JOIN to dbo.Contratscb ctcb with an ON clause 错误是您忘记了使用ON子句将INNER JOIN限定为dbo.Contratscb ctcb

....
dbo.Comptes_cli cpt ON cpt.Inscrip_id = ins.Inscrip_id INNER JOIN
dbo.ENTAPP enta ON enta.entApp = ins.Entappcr INNER JOIN
dbo.Contratscb ctcb INNER JOIN <-- should be an ON here
dbo.Contrats ct ON ctcb.Scont = ct.Scont AND ctcb.Siret = ct.Siret LEFT OUTER JOIN
dbo.Asso_SocUti_ENTTPG EntTPG ON EntTPG.Socuti = ctcb.Socuti LEFT OUTER JOIN
....

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM