2010-07-29 5 views
2

J'ai un peu un problème étrange.Syntaxe incorrecte près du mot-clé 'avec' (SQL)

Quand je lance ce SQL:

with ID_Table as ( 
    select row_number() over (order By SS_ID) As row_id, 
      ss_id 
     from slide_show) 
    select t0.* 
     from ID_Table as t1 
inner Join slide_show as t0 on t1.ss_id = t0.ss_id 
    where t1.row_id between 0 and 1 
order by t1.row_id asc; 

dans SQL Express, il court et retourne la première ligne comme il se doit (similaire à la limite de 0,1 à MySQL). Cependant, quand je lance ceci dans delphi via l'objet TADOQuery, je reçois l'erreur dans le titre. Je devine que l'objet ADO fait quelque chose le long du chemin mais je ne comprends pas quoi.

Remarque: Ceci est le SQL exact que je passe dans l'objet ADO.

Quelqu'un a-t-il des idées?

Répondre

2

Essayez:

SELECT t0.* 
FROM (SELECT row_number() over(ORDER BY SS_ID) AS row_id, ss_id FROM slide_show) AS t1 
INNER JOIN slide_show AS t0 
ON t1.ss_id = t0.ss_id 
WHERE t1.row_id BETWEEN 0 AND 1 
ORDER BY t1.row_id ASC; 
+0

Ceci est ma pensée aussi - Delphi/ADO ne supporte pas, ce qui est juste du sucre syntaxique pour une vue de table/inline dérivés anways ... –

+0

Il m'est apparu après l'affichage que c'est en fait 2 déclarations essayant de courir. Je ne savais pas que vous pouvez sélectionner une table mais c'est exactement ce dont j'avais besoin. Merci beaucoup! – webnoob

4

Le mot clé WITH doit être précédée d'un point-virgule quand il y a d'autres déclarations avant dans un lot (techniquement parlant, l'instruction précédente doit être terminée par « ; », mais juste le mettre avant le AVEC est un peu plus facile à maintenir).

Ma conjecture est que ADO définit une variable de connexion ou quelque chose de similaire, de sorte que le n'est plus d'abord dans le lot. Changez-le en "; WITH" et voyez si cela fonctionne.

+0

Je n'ai jamais eu à préfixer 'WITH' avec un point-virgule - SQL Server ou Oracle. –

+1

Je viens de tester pour être sûr que je ne me souviens pas correctement et reçu comme erreur sans le point-virgule. Par exemple, "SELECT 1 WITH My_CTE AS (SELECT 1 AS un)" échoue, mais j'ai ajouté le point-virgule et cela a fonctionné. C'était dans SQL 2008. –

+0

Implémentez la meilleure pratique en terminant toutes les instructions SQL avec un point-virgule et il n'y a pas de problème. – onedaywhen

2

Quel fournisseur OLE DB spécifiez-vous dans votre chaîne de connexion? Pour pouvoir utiliser la syntaxe WITH (CTE), vous devez utiliser le fournisseur SQL Native Client, par exemple.

Provider=SQLNCLI10.1

plutôt que de dire le fournisseur OLE DB SQL Server par exemple

Provider=SQLOLEDB.1

+0

C'est utile info, pour les situations où les sous-sélections ne fonctionnera pas, ce serait bien. – webnoob

2

Essayez ceci:

declare @a int 
with ID_Table as ( 
    select row_number() over (order By SS_ID) As row_id, 
      ss_id 
     from slide_show) 
    select t0.* 
     from ID_Table as t1 
inner Join slide_show as t0 on t1.ss_id = t0.ss_id 
    where t1.row_id between 0 and 1 
order by t1.row_id asc; 

//------------------------------ 
//with can not be the first row 
Questions connexes