2010-07-29 110 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 
相關問題