Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关键字';与';(SQL)_Sql_Sql Server_Delphi_Ado - Fatal编程技术网

关键字';与';(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

我有一点奇怪的问题

当我运行此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;
在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,这只是派生表/内联视图的语法糖……在发布后,我突然意识到这实际上是两条试图运行的语句。我不知道你可以再选择一张桌子,所以这正是我需要的。非常感谢!这是有用的信息,对于子选择不起作用的情况,这将是很好的。