2011-06-25 16 views
3

これで働く元のSQL Serverのクエリ:変換SQL Serverクエリ

私はDelphiのSQLに変換
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' 

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文の内側に文字列を引用されています。この方法であなたが照らし合わせてコードを保護する、addtionalのアドバイスとして

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; 

、代わりに文字列リテラルのパラメータを使用してみてください他の利点の横にSQLインジェクション。この記事をチェックしてくださいUsing Parameters in Queries

+0

私はあなたのクエリを実行し、私の 'as days days'カラムは表示されません。 – user763539

+0

私はあなたの提案を使用し、date、room_typesをパラメータに置き換えましたが、まだDAYSは表示されません。興味深い... SQLサーバは何の問題もなく表示します...これはなぜですか? – user763539

+0

TMSグリッドとcxGridは、「日」フィールドを表示したくないようですが、グリッドで構築されたDelphi 8standardのフィールドは表示されません。確かに奇妙なことです.... – user763539