关键字';与';(SQL)
我有一点奇怪的问题 当我运行此SQL时:关键字';与';(SQL),sql,sql-server,delphi,ado,Sql,Sql Server,Delphi,Ado,我有一点奇怪的问题 当我运行此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 wher
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;
在SQLExpress中,它运行并返回第一行(类似于MySQL中的限制0,1)。但是,当我通过TADOQuery对象在delphi中运行此操作时,我收到标题中的错误。我猜ADO对象正在做一些事情,但我不明白是什么
注意:这正是我传递给ADO对象的SQL
有人有什么想法吗?试试:
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;
当批处理中的WITH关键字前面有其他语句时,需要在WITH关键字前面加分号(从技术上讲,前面的语句必须以“;”结尾,但仅将其放在WITH之前更易于维护)
我的猜测是ADO设置了一个连接变量或类似的东西,因此WITH不再是批处理中的第一个。将其更改为“WITH”,然后查看是否有效。在连接字符串中指定哪个OLE DB提供程序?要将
与
(CTE)语法结合使用,您需要使用SQL本机客户端提供程序,例如:
Provider=SQLNCLI10.1
而不是说SQL Server OLE DB提供程序,例如
Provider=SQLOLEDB.1
尝试以下操作:
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
我从来没有在
前面加过分号--SQL Server或Oracle,我只是测试了一下,以确保我没有记错,没有分号就被当作错误接收。例如,“选择1并将我的内容作为(选择1作为一个)”失败,但我添加了分号,它成功了。这是在SQL 2008中。通过以分号结束所有SQL语句来实现最佳实践,没有问题。如果您的代码被附加到其他您有限制或没有控制权的代码上,这仍然会成为问题。适用于我-python adodbapi+MS SQL Express 2005,Provider=sqloledb。所以试试看。这也是我的想法——Delphi/ADO不支持WITH,这只是派生表/内联视图的语法糖……在发布后,我突然意识到这实际上是两条试图运行的语句。我不知道你可以再选择一张桌子,所以这正是我需要的。非常感谢!这是有用的信息,对于子选择不起作用的情况,这将是很好的。