RegEx для разбора SQL-запроса в C # - PullRequest
2 голосов
/ 27 июля 2010

Мне нужно написать RegEx на C #, чтобы проанализировать SQL-запрос соединения, который представлен в виде строки. Может кто-нибудь, пожалуйста, помогите мне, потому что я новичок в этом. Большое спасибо

это моя проблема:

string query = @"SELECT table1.column1, table1.column2, table2.coulmn1, table2.column2
                 FROM table1 INNER JOIN table2 ON table1.column5 = table2.column5";

что мне действительно нужно, это поместить все важные данные в отдельные переменные, например:

string class1 = table1    
string class2 = table2    
string joinForeignKey1 = table1.column5    
string joinForeignKey2 = table2.column5    
List<string> attributes1 = table1.column1, table1.column2    
List<string> attributes2 = table2.column1, table2.column2

// COMMENT

Я понял, что допустил ошибку в SQL-запросе, поэтому будет предложение ON.

Я могу заставить пользователя предоставить правильный синтаксис, так что проблем не будет.

Я не упомянул о том, что может быть более одного предложения JOIN ON (несколько соединений).

Большое спасибо, и я буду признателен за любую помощь.

Ответы [ 2 ]

5 голосов
/ 27 июля 2010

Извлеките это из комментариев, так как я думаю, что это правильный ответ здесь:

SQL - № 3 в списке вещей, которые вы не должны пытаться анализировать с помощью регулярных выражений, сразу за HTML и MUMPS . Используйте специфический для диалекта выделенный анализатор SQL , а не регулярное выражение.

1 голос
/ 27 июля 2010

Лично я не рекомендую делать это, если у вас нет ОЧЕНЬ, ОЧЕНЬ уважительной причины для этого, а также полный контроль над тем, как будет написан SQL.

Прежде всего, синтаксис, который вы указали для оператора SQL, - это синтаксис соединения старого стиля, не использующий более общий синтаксис ON.

Что-то вроде

SELECT A.ColumnA, B.ColumnB
FROM MyTable A
    INNER JOIN YourTable B
        ON (A.MyIdentity = B.MyForeignKey)

Поэтому, если вы не можете заставить пользователей вводить запросы в старом синтаксисе, вы уже идете по пути, который не будет работать.

Если бы я был вынужден делать такие вещи, и у меня был этот контроль, я лично не стал бы беспокоиться о RegEx из-за того, что процесс так структурирован. я бы просто использовал базовые манипуляции со строками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...