Разобрать параметры из запроса SQL с помощью Delphi - PullRequest
3 голосов
/ 30 марта 2010

Как я могу разобрать и извлечь параметры из SQL-запроса с помощью delphi?

пример:

из этого запроса

SELECT * FROM MyTable 
WHERE Field1=:Param1 
AND Field2=:Param2 
AND (Field3=:Param3 OR Field4=:Param4)

я хочу получить

Param1 Param2 Param3 Param4

Заранее спасибо.

Ответы [ 2 ]

10 голосов
/ 30 марта 2010

@ Сальвадор, вы можете использовать функцию TParams.ParseSQL для получения параметров.

см. Этот простой код

program Project241;

{$APPTYPE CONSOLE}

uses
  db, //for use TParams
  Classes,// 
  SysUtils;

procedure GetParamsFromSQL(SQL:string;Const ListParams:TStrings);
var
  ParamList: TParams;
  i: integer;
begin
 ListParams.Clear;//Clear the list
    ParamList := TParams.Create(nil);
    try
      ParamList.ParseSQL(SQL, True); //Force to create the params from the SQL
      for i := 0 to ParamList.Count - 1 do 
        ListParams.Add(ParamList[i].Name);
    finally
    ParamList.Free;
    end;
end;

var
  ParamList : TStrings;
begin
  ParamList:=TStringList.Create;
  try
    GetParamsFromSQL('SELECT * FROM MyTable WHERE Field1=:Param1 AND Field2=:Param2 AND (Field3=:Param3 OR Field4=:Param4)',ParamList);
    Writeln(ParamList.text);
    Readln;
  finally
  ParamList.Free;
  end;
end.

возвращает:

Param1
Param2
Param3
Param4
0 голосов
/ 30 марта 2010

Для такого простого запроса, как этот, вы можете взломать простой алгоритм чтения текста, подобный следующему. Это работает для вашего конкретного запроса, и это может быть "достаточно хорошо". Просто передайте пустой TStringList.

uses
  StrUtils;

procedure ExtractParams(input: string; output: TStrings);
var
  colon, endpoint: integer;
begin
  colon := pos(':', input);
  while colon <> 0 do
  begin
    input := RightStr(input, length(input) - colon);

    endpoint := 0;
    repeat
      inc(endpoint)
    until input[endpoint] in [' ', ')']; //add other characters here as necessary

    output.Add(LeftStr(input, endpoint - 1));
    colon := pos(':', input);
  end;
end;

Однако, если вы хотите выполнить более сложный синтаксический анализ SQL, вам лучше всего взглянуть на настоящий парсер. Взгляните на GOLD Parser , который может анализировать несколько разных языков, включая SQL, на основе файлов определения языка. На сайте доступна реализация парсера на Delphi.

...