2011-06-25 37 views
3

這是原來的SQL服務器查詢其工作原理:轉換SQL Server查詢德爾福語法

use HIS 

SELECT 
room_type,rate_start_date,rate_end_date,rate 
, DATEDIFF(DAY,case when rate_end_date < '2011.08.21' 
then '2011.08.19' 
else rate_start_date 
end, 
case when rate_start_date > '2011.08.19' 
then '2011.08.21' 
else rate_end_date 
end 
) AS days FROM room_rates 
WHERE room_type = 'DBLMS' AND rate_start_date <= '2011.08.21' 
AND rate_end_date > '2011.08.19' 

我把它轉化爲德爾福SQL:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
uniQuery1.Close; 
uniQuery1.SQL.Clear; 
uniQuery1.SQL.Add('SELECT room_type,rate_start_date,rate_end_date,rate,'); 
uniQuery1.SQL.Add('DATEDIFF(DAY,case when rate_end_date < 2011.08.21 then 2011.08.19 else rate_start_date end,'); 
uniQuery1.SQL.Add('case when rate_start_date > 2011.08.19'); 
uniQuery1.SQL.Add('then 2011.08.21 else rate_end_date end) AS days FROM room_rates'); 
uniQuery1.SQL.Add('WHERE room_type = DBLMS AND rate_start_date <= 2011.08.21'); 
uniQuery1.SQL.Add('AND rate_end_date > 2011.08.19'); 
uniQuery1.Open; 
end; 

但是我得到「無效的列名稱DBLMS''

我在這裏錯過了什麼? DBLMS不是一列。

回答

10

你不加引號的字符串的SQL語句的內部嘗試重寫你的代碼到這一點:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    uniQuery1.Close; 
    uniQuery1.SQL.Clear; 
    uniQuery1.SQL.Add('SELECT room_type,rate_start_date,rate_end_date,rate,'); 
    uniQuery1.SQL.Add('DATEDIFF(DAY,case when rate_end_date < ''2011.08.21'' then ''2011.08.19'' else rate_start_date end,'); 
    uniQuery1.SQL.Add('case when rate_start_date > ''2011.08.19'''); 
    uniQuery1.SQL.Add('then ''2011.08.21'' else rate_end_date end) AS days FROM room_rates'); 
    uniQuery1.SQL.Add('WHERE room_type = ''DBLMS'' AND rate_start_date <= ''2011.08.21'''); 
    uniQuery1.SQL.Add('AND rate_end_date > ''2011.08.19'''); 
    uniQuery1.Open; 
end; 

至於addtional建議,嘗試使用參數,而不是字符串字面量,這樣你會保護你的代碼對旁邊的sql注入優勢。檢查這篇文章Using Parameters in Queries

+0

我運行您的查詢,我的'天'欄不顯示。 – user763539

+0

我用你的建議,並用參數替換日期,room_types,但仍然不顯示。有趣... SQL服務器顯示天沒有問題...這是爲什麼? – user763539

+0

看來,TMS網格以及cxGrid不想顯示'days'字段,而Delphi 8標準的網格則是這樣)。這確實很奇怪.... – user763539