2010-07-29 107 views
2

我有点奇怪的问题。关键字'with'附近的语法不正确(SQL)

当我运行这个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; 

中的SQL Express,它运行和返回第一行,因为它应该(类似于限制0,1在MySQL)。但是,当我通过TADOQuery对象在delphi中运行时,我收到标题中的错误。我猜ADO对象正在做一些事情,但我不明白。

注意:这是我传递给ADO对象的确切SQL。

有没有人有什么想法?

回答

2

尝试:

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

这是我的想法太 - 德尔福/ ADO不支持,这仅仅是一个派生表/内嵌视图anways语法糖... – 2010-07-29 14:58:52

+0

发布后,它发生了这实际上是2条语句试图运行。我不知道你可以选择一个表,但这正是我所需要的。非常感谢! – webnoob 2010-07-29 15:10:27

4

有WITH关键字需要由分号当有之前的其它语句在批处理(从技术上来说,前面的语句必须与被终止之前“;”,但只是把它放在WITH之前更容易维护)。

我的猜测是ADO设置了一个连接变量或类似的东西,所以WITH不再是批处理中的第一个。将其更改为“; WITH”并查看是否有效。

+0

我从来没有必须在分号前添加“WITH” - SQL Server或Oracle。 – 2010-07-29 14:57:18

+1

我刚刚测试了一下,以确保我没有记错,并且没有分号就收到了错误。例如,“SELECT 1 WITH My_CTE AS(SELECT 1 AS one)”失败,但我添加了分号并且它工作正常。这在SQL 2008中。 – 2010-07-29 15:03:41

+0

通过用分号结束所有SQL语句来实现最佳实践,这没有问题。 – onedaywhen 2010-07-29 15:25:44

2

您在连接字符串中指定了哪个OLE DB提供程序?为了能够使用WITH(CTE)语法,您需要使用SQL Native Client提供程序,例如

Provider=SQLNCLI10.1

,而不是说,SQL Server OLE DB提供例如

Provider=SQLOLEDB.1

+0

这是很有用的信息,对于子选择无法正常工作的情况,这样做会很好。 – webnoob 2010-07-29 15:28:18

2

试试这个:

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 
相关问题