Конвертировать запрос SQL-сервера в синтаксис Delphi - PullRequest
3 голосов
/ 25 июня 2011

Это оригинальный запрос 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'

Я преобразовал его в Delphi 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 не является столбцом.

1 Ответ

10 голосов
/ 25 июня 2011

Вы не цитируете строки внутри вашего предложения 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;

В качестве дополнительного совета, попробуйте использовать параметры вместо строковых литералов, таким образом вы защитите свой кодпротив инъекций sql помимо других преимуществ.проверить эту статью Using Parameters in Queries

...