2009-12-17 68 views
5

我正在尋找一個ANSI-SQL方法做一個選擇查詢不返回任何記錄,但填充TDataSet中的字段結構。ANSI SQL查詢來強制返回0記錄

我發現的方法是通過加入「其中1 = 0」中的任何查詢,例如:

Select Id, name, province 
from customers 
where 1=0 

這是一個相當簡單的例子,它變成多一點複雜,當我必須工作用戶輸入查詢,然後解析它們,刪除where子句(如果它已經有一個),並替換爲「1 = 0」。

如果用戶輸入的查詢的最後一個子句是WHERE子句,那麼就一點問題都沒有,但對更復雜的查詢是這樣的:

select 
    c.lastname, 
    sum(cs.amount) 
from customersales cs 
join customers c on c.idcustomer=cs.idcustomer 
/* where 1=0 */ 
group by c.idcustomer, c.lastname 

通過使用「其中1 = 0 「方法,在前面的例子中插入它的唯一方法是通過一個相當強大的SQL解析器(記住用戶可以輸入複雜的查詢,包括子查詢等等),誰可以理解包含此字符串的位置。

有誰知道一個更好的方式來做到這一點?我不能使用「限制1」,因爲它必須採用ANSI方式。

+0

您需要此功能嗎? – 2009-12-17 20:31:14

+0

我需要這個功能,因爲我在軟件中添加了一項功能,可讓用戶創建自定義查詢,然後使用查詢顯示圖表,表格以及使用它們創建報表。我需要這個來設計報告。 要顯示帶有可用數據集的報表設計器(從用戶創建的查詢中提取),我需要此功能。 「數據集」是查詢後提取的簡單字段列表。 順便說一句,我使用的FastReport 4 – 2009-12-17 20:39:04

+0

創建客戶提出查詢:你爲什麼不使用附帶的快速報告快速查詢生成器。爲什麼不快速立方體? – 2009-12-17 21:50:22

回答

11

有關添加你自己的SELECT各地用戶的選擇是什麼?

SELECT * FROM (
select 
    c.lastname, 
    sum(cs.amount) 
from customersales cs 
join customers c on c.idcustomer=cs.idcustomer 
/* where 1=0 */ 
group by c.idcustomer, c.lastname 
) x 
WHERE 0=1 

編輯:ORDER BY不會與該解決方案的工作,但因爲你沒有行,你可以嘗試在必要時從查詢中刪除。

+1

感謝彼得,在PostgreSql和火鳥測試,它的工作原理! 我不得不添加的唯一東西是內部查詢的別名。 select * from(內部查詢)AS FOO其中1 = 0。 再次感謝您。 – 2009-12-17 20:43:25

0

以供將來參考的情況下,人們會在這裏結束與一個不同的目標:請注意,使得WHERE子句矛盾可能會導致優化程序來決定根本不執行的子計劃。因此,如果您需要查詢的一些副作用(無論是溫暖的緩存,執行一個程序,無論),建議。 :-)

0

如果您使用MSSQL服務器,那麼你可以用你的查詢各地SET FMTONLY

SET FMTONLY ON SELECT * FROM tablename SET FMTONLY OFF 
0

在火鳥你可能「準備」的聲明,而不是「執行」它。準備工作只是解析語句並返回字段列表。

0

或者使用

CustomerSQL='SELECT <Fields> FROM <Table>'; 
MySQL=Replace(CustomerSQL,'SELECT ','SELECT TOP 0 '); 

(也許有些健全檢查,但你的想法 - 一個SELECT TOP 0只會返回包含記錄佈局的元數據,並沒有記錄數據)。