Регулярное выражение для поиска всех имен таблиц в запросе - PullRequest
7 голосов
/ 11 ноября 2008

Я не такой горячий в регулярных выражениях, и это заставило мой маленький ум немного растаять.

Я пытаюсь найти все имена таблиц в запросе. Скажем, у меня есть запрос:

SELECT one, two, three FROM table1, table2 WHERE X=Y

Я хотел бы вытащить "table1, table2" или "table1" и "table2"

Но что, если нет утверждения "где"? Это может быть конец файла, или может быть группа или порядок и т. Д. Я знаю, что «большую часть времени» это не будет проблемой, но мне не нравится идея кодирования для «большинства» ситуации и зная, что я оставил дыру, которая может привести к ошибкам позже.

Это выполнимое выражение Regex? Я являюсь игроком Регекса?

(П.С. это будет сделано в C #, но предполагается, что это не имеет большого значения).

Ответы [ 12 ]

0 голосов
/ 23 сентября 2010

Это вытащит имя таблицы на вставке в запрос:

(?<=(INTO)\s)[^\s]*(?=\(())

Следующие будут делать то же самое, но с выбором, включающим объединения

(?<=(from|join)\s)[^\s]*(?=\s(on|join|where))

Наконец, возвращаясь к вставке, если вы хотите вернуть только те значения, которые содержатся в запросе вставки, используйте следующее регулярное выражение

(?i)(?<=VALUES[ ]*\().*(?=\))

Я знаю, что это старая ветка, но она может помочь кому-то еще осмотреться

Наслаждайтесь

0 голосов
/ 12 февраля 2010

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

PLUS, если запрос включает ссылку на представление или UDF, информация о том, какие таблицы лежат в основе, вообще не будет присутствовать в строке, что делает совершенно непрактичным получение этой информации путем ее анализа. Кроме того, вам нужно уметь обнаруживать временные таблицы и исключать их из результатов.

Если вы должны сделать это, лучшим подходом будет использование API-интерфейсов для конкретного механизма базы данных, для которого предназначен SQL. Например, вы можете создать представление на основе запроса, а затем использовать API-интерфейс DB Server для определения зависимостей для этого представления. Механизм БД сможет анализировать его гораздо надежнее, чем когда-либо, без огромных усилий по обратному проектированию механизма запросов.

Если вы случайно работаете с SQL Server, вот статья об обнаружении зависимостей на этой платформе: Поиск зависимостей в SQL Server 2005

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