線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1977
推到 Plurk!
推到 Facebook!

如何在AdoQuery中使用WITH遞迴的SQL寫法

答題得分者是:careychen
shougo
一般會員


發表:5
回覆:4
積分:1
註冊:2003-03-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-05 11:46:39 IP:122.118.xxx.xxx 訂閱
我有一支程式,其中有一個AdoQuery中的SQL如下:
WITH XYZ(S1,S2) AS
(
SELECT A.S1,A.S2 FROM A
UNION ALL
SELECT A.S1,A.S2 FROM A
INNER JOIN XYZ ON A.S1=XYZ.S2
)
SELECT * FROM XYZ
ORDER BY S1,S2
OPTION(MAXRECURSION 100)

在Delphi程式中的寫法如下:
With AdoQuery Do
begin
Close;
SQL.Clear;
SQL.Add(' WITH XYZ(S1,S2) AS ( SELECT A.S1,A.S2 FROM A UNION ALL '
' SELECT A.S1,A.S2 FROM A INNER JOIN XYZ ON A.S1=XYZ.S2 ) '
' SELECT * FROM XYZ ORDER BY S1,S2 ON(MAXRECURSION 100) ');
Open;
end;
再將Adoquery.Open時會出現錯誤:'Incorrect syntax near the keyword 'WITH''.
請問要如何解決此問題呢?我直接將SQL拿去SQL Server下是沒問題的

ps.環境為Delphi 5 SQL Server 2005
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-06 17:50:01 IP:122.116.xxx.xxx 未訂閱

===================引 用 shougo 文 章===================
我有一支程式,其中有一個AdoQuery中的SQL如下:
WITH XYZ(S1,S2) AS
(
SELECT A.S1,A.S2 FROM A
UNION ALL
SELECT A.S1,A.S2 FROM A
INNER JOIN XYZ ON A.S1=XYZ.S2
)
SELECT * FROM XYZ
ORDER BY S1,S2
OPTION(MAXRECURSION 100)

在Delphi程式中的寫法如下:
With AdoQuery Do
begin
Close;
SQL.Clear;
SQL.Add(' WITH XYZ(S1,S2) AS ( SELECT A.S1,A.S2 FROM A UNION ALL '
' SELECT A.S1,A.S2 FROM A INNER JOIN XYZ ON A.S1=XYZ.S2 ) '
' SELECT * FROM XYZ ORDER BY S1,S2 ON(MAXRECURSION 100) '); <--OPTION
Open;
end;
再將Adoquery.Open時會出現錯誤:'Incorrect syntax near the keyword 'WITH''.
請問要如何解決此問題呢?我直接將SQL拿去SQL Server下是沒問題的

ps.環境為Delphi 5 SQL Server 2005

您好,
我沒有 sql server 環境可以測, 也不知道 上面紅字的部份 是不是 造成錯誤的原因
不過, 您說那段語法在 sql server 是 ok 的, 透過 ado 郤不行
那可不可試一下 比較簡單的 with ... select 語法 ( 非 recursive )
先確定 ado 支不支援 with clause.
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-07 02:21:43 IP:60.250.xxx.xxx 訂閱
WITH XYZ(S1,S2) AS
(
SELECT A.S1,A.S2 FROM A
UNION ALL
SELECT A.S1,A.S2 FROM A
INNER JOIN XYZ ON A.S1=XYZ.S2
)
SELECT * FROM XYZ
ORDER BY S1,S2
OPTION(MAXRECURSION 100)
====================================
你除了前輩所說的 Option 打成 ON 以外
你的 XYZ Table 應該是不存在的
那 Inner joni xzy on a.s1=xyz.s2
這裡的 Table 你是不是代錯了

你的 sql 語法,我在 sql server 上試過
是不成功的
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
shougo
一般會員


發表:5
回覆:4
積分:1
註冊:2003-03-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-12-08 14:11:49 IP:122.118.xxx.xxx 訂閱
首先感謝兩位的回答^^

Dear st33chen:
那個Option是我在PO文時的筆誤,程式中並沒有寫錯,試過很多次,似乎adoQuery無法支援這種語法

Dear AndrewK:
那個XYZ是代表遞迴集合Table的名稱,這個語法我在SQL Server上跑是OK的,有資料出來

謝謝
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-12-08 14:55:52 IP:60.248.xxx.xxx 訂閱
hi,請您看一下在您的 ADOConnection 提供者是不是選擇

Microsoft OLE DB Provider for SQL Server ,如果是的話,請改成

SQL Native Client 即可!!


===================引 用 shougo 文 章===================
首先感謝兩位的回答^^

Dear st33chen:
那個Option是我在PO文時的筆誤,程式中並沒有寫錯,試過很多次,似乎adoQuery無法支援這種語法

Dear AndrewK:
那個XYZ是代表遞迴集合Table的名稱,這個語法我在SQL Server上跑是OK的,有資料出來

謝謝
------
價值的展現,來自於你用哪一個角度來看待它!!
shougo
一般會員


發表:5
回覆:4
積分:1
註冊:2003-03-20

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-12-08 17:36:17 IP:122.118.xxx.xxx 訂閱
Dear careychen,我試過了,改設定就可以跑遞迴的SQL了,非常感謝你
系統時間:2024-05-06 4:56:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!