2009-12-04 6 views
6

Я хотел бы иметь возможность анализировать произвольный оператор SQL SELECT и извлекать различные компоненты (столбцы, отношения, условия JOIN, условия WHERE, столбцы ORDER BY), в идеале используя Delphi. Быстрый поиск в Google показывает несколько различных бесплатных продуктов, но неясно, полны ли они и/или находятся в активной разработке.Библиотека для анализа операторов SQL

Мне нужно немедленно извлечь список отношений, используемых в серии определений VIEW, чтобы убедиться, что требуемые представления или таблицы существуют до того, как я попытаюсь СОЗДАТЬ представление. Так, например, для справки:

SELECT PersonID, LastName, OrderID 
FROM People P INNER JOIN Orders O ON P.PersonID = O.PersonID 

Мне нужно вернуть значения «Люди» и «Заказы». (Очевидно, что это простой пример. Я хочу иметь возможность обрабатывать более сложные случаи, когда, например, слово «FROM» может отображаться в списке столбцов как часть выражения).

Я пытаюсь предоставить эту услугу в базе данных, что позволяет использовать STDCALL функций, экспортируемых из DLL, поэтому в идеале любой кандидат библиотека будет вызывать из Delphi или C.

+0

Можете ли вы, возможно, сказать мне, какой SQL движок вы используете? Если я не пропустил это. – Reallyethical

+0

Будьте счастливы, но это вам не поможет. Я использую R: Base. –

ответ

6

Взгляните на Gold Parser. у него есть версия Delphi доступна, и грамматику SQL на странице загрузки.

+0

Спасибо. Это не оказалось в моем поиске Google, по-видимому, потому, что часть SQL находится на отдельной странице из анализатора и упоминания Delphi. –

+0

Да, это некрасиво. Хорошая система. –

0

SQL парсеры сложнее.

ли вы думаете о таком подходе:

  1. Начало транзакции.
  2. Отправьте команду CREATE VIEW на сервер.
  3. поймать ошибку (любой достойный драйвер базы данных должен это сделать).
  4. если произошла ошибка, проанализируйте сообщение об ошибке и покажите отсутствующие таблицы клиенту.
  5. Откат

посмотреть пример (PostgreSQL):

=> begin; 
BEGIN 
=> create view testview as select foo,bar from a join b on a.x=b.y; 
ERROR: relation "a" does not exist 
LINE 1: create view testview as select foo,bar from a join b on a.x=... 
                ^
=> rollback; 
ROLLBACK 

или этот (Oracle):

SQL> create view testview as select foo,bar from a join b on a.x=b.y; 
create view testview as select foo,bar from a join b on a.x=b.y 
                * 
ERROR at line 1: 
ORA-00942: table or view does not exist 

SQL> rollback; 

Rollback complete. 
+0

Да, это то, что я делаю сейчас. Если я могу обнаружить проблемы в то время, когда я создаю файл определения структуры из исходной базы данных, однако я могу сразу решить некоторые из них (по сути, я пытаюсь выполнить транзитивное замыкание во всех определениях представлений в базе данных, что к сожалению, СУБД не выполняет при представлении списка просмотров). –

+0

Ha. Это, безусловно, взлом, но веселье. К сожалению, плакат не сказал, что у него даже есть работающий сервер баз данных для работы.Прежде чем попробовать что-то подобное, убедитесь, что вы исследуете потенциальные векторы угрозы! – Dolph

+0

Я стою исправлено, не имея БД. Вы отправили, когда я набрал свой ответ, Ларри. :) – Dolph

0

Вы можете использовать Delphi с ADODB.

Используйте TADOQuery, чтобы проверить, хорош ли ваш запрос или нет, без открытия набора записей. Вы также можете получить имена полей запроса.

Капля TADOConnection на форме. Бросьте TMemo и TButton и попробовать этот код:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    lADOQuery : TADOQuery; 
    lFieldNames : TStrings; 
begin 
    lADOQuery := TADOQuery.Create(nil); 
    try 
    lADOQuery.Connection := ADOConnection1; 
    lADOQuery.SQL.Text := Memo1.Text; 
    lFieldNames := TStringList.create; 
    try 
     lADOQuery.GetFieldNames(lFieldNames); 

     showmessage(lFieldNames.Text); // Show fieldNames of the query 

     // To show that the dataset is not actually opened try this : 
     // Throws an exception (Dataset closed) 
     //showmessage(inttostr( lADOQuery.RecordCount)); 
    except 
     On e: Exception do 
     ShowMessage('Invalid query'); 
    end; 
    lFieldNames.free; 
    finally 
    lADOQuery.free; 
    End; 
end; 
+0

Моя СУБД недоступна с использованием ADO. –

Смежные вопросы