Excel: Syntaxe incorrecte près du mot-key 'SELECT'

Scénario: Je construis un rapport dans Excel pour calculer les commissions. Ceci est basé sur les factures du mois précédent. J'ai créé la requête tsql suivante et créé une connection en utilisant MSQuery . J'ai testé la requête et ça fonctionne parfaitement jusqu'à ce que je change mon état Where pour utiliser le paramètre "?" donc je peux, puis je reçois l'erreur suivante:

 Incorrect Syntax near the keyword `'SELECT'` 

Voici la requête:

 SELECT v_rpt_Invoices.Invoice_Number, v_rpt_Invoices.Territory, v_rpt_Company.Account_Nbr, v_rpt_Invoices.Company_Name, v_rpt_Invoices.Date_Invoice, v_rpt_Invoices.Location, v_rpt_Invoices.TicketNbr, v_rpt_Invoices.Project_ID, v_rpt_Invoices.Invoice_Type, v_rpt_Invoices.Status_Description, CASE WHEN TicketNbr <> 0 THEN 'Service Ticket' WHEN Project_ID IS NOT NULL THEN 'Project' ELSE 'Other' END AS Invoice_For, CASE WHEN ticketNbr <> 0 THEN (SELECT v_rpt_Service.Board_Name FROM v_rpt_Service WHERE v_rpt_Invoices.TicketNbr = v_rpt_Service.TicketNbr) WHEN Project_ID IS NOT NULL THEN Project_ID ELSE 'Other' END AS Service_Board_Project, CASE WHEN TicketNbr <> 0 THEN (SELECT Bill_Method FROM SR_Service WHERE v_rpt_Invoices.TicketNbr = SR_Service.SR_Service_RecID) WHEN project_id IS NOT NULL THEN (SELECT PM_Billing_Method_ID FROM PM_Project WHERE v_rpt_Invoices.PM_Project_RecID = PM_Project.PM_Project_RecID) ELSE 'NONE' END AS BillingMethod, v_rpt_Invoices.Invoice_Amount, CASE WHEN (TicketNbr <> 0 AND (SELECT Bill_Method FROM SR_Service WHERE v_rpt_Invoices.TicketNbr = SR_Service.SR_Service_RecID) = 'A') THEN Invoice_Amount * 0.7 WHEN (TicketNbr <> 0 AND (SELECT Bill_Method FROM SR_Service WHERE v_rpt_Invoices.TicketNbr = SR_Service.SR_Service_RecID) = 'F') THEN 0.01 WHEN (project_id IS NOT NULL AND (SELECT PM_Billing_Method_ID FROM PM_Project WHERE v_rpt_Invoices.PM_Project_RecID = PM_Project.PM_Project_RecID) = 'A') THEN Invoice_Amount * 0.7 WHEN (project_id IS NOT NULL AND (SELECT PM_Billing_Method_ID FROM PM_Project WHERE v_rpt_Invoices.PM_Project_RecID = PM_Project.PM_Project_RecID) = 'F') THEN 0.01 ELSE 0.00 END AS Cost FROM v_rpt_Invoices INNER JOIN v_rpt_Company ON v_rpt_Invoices.Company_RecID = v_rpt_Company.Company_RecID **WHERE (v_rpt_Invoices.Date_Invoice >= ?)** order by Territory, Invoice_For 

Supprimer cette ligne

  **WHERE (v_rpt_Invoices.Date_Invoice >= ?)** 

Ce n'est pas un SQL valide – il semble que vous souhaitez commenter utiliser double tiret.

Sauf si vous mettez simplement le ** pour montrer ce que vous avez changé. Dans ce cas, vous devez avoir une valeur où le ? le SQL ne fonctionnera pas.


En tant qu'asside, cette requête pourrait être beaucoup plus claire et plus rapide. Envisagez de consolider les sous-requêtes en une jointure. Par exemple, la sous-requête suivante

 SELECT Bill_Method FROM SR_Service WHERE v_rpt_Invoices.TicketNbr = SR_Service.SR_Service_RecID 

DOIT être appelé pour chaque ligne – si vous faites une jointure, passez de O (nm) à O (n + m) où n est la taille de v_rpt_Invoices et m est la taille de SR_Service.

C'est l'une des sous-requêtes potentielles que vous pouvez optimiser.

Voici un exemple de roulement dans les sous-requêtes à votre exemple (je ne peux pas tester, donc il pourrait avoir des erreurs / fautes de frappe)

 SELECT v_rpt_Invoices.Invoice_Number, v_rpt_Invoices.Territory, v_rpt_Company.Account_Nbr, v_rpt_Invoices.Company_Name, v_rpt_Invoices.Date_Invoice, v_rpt_Invoices.Location, v_rpt_Invoices.TicketNbr, v_rpt_Invoices.Project_ID, v_rpt_Invoices.Invoice_Type, v_rpt_Invoices.Status_Description, CASE WHEN TicketNbr <> 0 THEN 'Service Ticket' WHEN Project_ID IS NOT NULL THEN 'Project' ELSE 'Other' END AS Invoice_For, CASE WHEN ticketNbr <> 0 THEN v_rpt_Service.Board_Name WHEN Project_ID IS NOT NULL THEN Project_ID ELSE 'Other' END AS Service_Board_Project, CASE WHEN TicketNbr <> 0 THEN SR_Service.Bill_Method WHEN project_id IS NOT NULL THEN PM_Project.PM_Billing_Method_ID ELSE 'NONE' END AS BillingMethod, v_rpt_Invoices.Invoice_Amount, CASE WHEN (TicketNbr <> 0 AND SR_Service.Bill_Method ='A') THEN Invoice_Amount * 0.7 WHEN (TicketNbr <> 0 AND SR_Service.Bill_Method ='F') THEN 0.01 WHEN (project_id IS NOT NULL AND PM_Project.PM_Billing_Method_ID = 'A') THEN Invoice_Amount * 0.7 WHEN (project_id IS NOT NULL AND PM_Project.PM_Billing_Method_ID = 'F') THEN 0.01 ELSE 0.00 END AS Cost FROM v_rpt_Invoices INNER JOIN v_rpt_Company ON v_rpt_Invoices.Company_RecID = v_rpt_Company.Company_RecID LEFT JOIN SR_Service ON v_rpt_Invoices.TicketNbr = SR_Service.SR_Service_RecID LEFT JOIN PM_Project ON v_rpt_Invoices.PM_Project_RecID = PM_Project.PM_Project_RecID LEFT JOIN v_rpt_Service ON v_rpt_Invoices.TicketNbr = v_rpt_Service.TicketNbr WHERE (v_rpt_Invoices.Date_Invoice >= '1/1/2013') order by Territory, Invoice_For