Если все запросы имеют только один стол, и комментариев нет, смешные дела с комментариями, использование регулярных выражений для этого - это потерянное предложение. Вместо этого:
SET SHOWPLAN_ALL ON;
--All your queries here
См. set showplan_all docs.
Когда я говорю, что регулярное выражение будет сложным, это то, что я имею в виду. Это лишь некоторые из соображений:
Вы должны обнаружить начало строк в кавычках: "
, '
и [
и игнорировать все символы внутри, пока не будет прекращено надлежащим образом. Не завершайте, если символ конца удваивается (т. Е. 'this is ''fun'', he said'
не останавливается после is
).
Вы должны исключить однострочные комментарии --
, которые не входят в кавычки, и завершают их на следующем CRLF. Котировки комментариев внутри комментариев не начинаются, как обычно.
Вы должны исключить многострочные комментарии (начиная с /*
), которые не внутри кавычек или внутри одной строки комментария, а затем пропустить через все остальное, за исключением терминатора, */
. В своем регулярном выражении обязательно избегайте символа *
с обратной косой чертой \
.
Вы должны затем найти действительные FROM
пункты с надлежащими словоразделами (нет ложного матч на имена столбцов SelfRom
или AfroMonkey
, например).
Чтобы правильно завершить ЕК, вы должны остановить захват, когда вы видите любое ключевое слово, включая WHERE
, GROUP BY
, HAVING
, ORDER BY
и WITH
; и так как запросы SQL не требуется, чтобы иметь точку с запятой терминатор ;
Вам также придется прекратить в SELECT
, DBCC
, SET
, CREATE
, ALTER
, DROP
и так далее, и так далее.
Но даже предыдущие два очка не хватает на самом деле сами по себе, потому что, если ваш запрос выглядит следующим образом:
SELECT *
FROM
MyTable T
INNER JOIN (
SELECT * FROM YourTable Y WHERE Active = 1
) X ON T.ID = Y.ID
INNER JOIN AnotherTable A
ON X.AID = A.AID
Теперь вы должны разобрать круглые скобки и НЕ остановить запись вашего из пункта, когда вы видите любое из этих ключевых слов. И вы должны следить за тем, сколько скобок вы находитесь в глубине, и продолжать игнорировать, пока вы не будете такими. И, наконец, что вы делаете с ними, потому что производная таблица похожа на таблицу - вы хотите, чтобы полный текст производной таблицы или только таблицы внутри?
Чтобы сделать все это, вы не можете просто начать согласования на в тексте первого действительного FROM
, потому что это может быть внутри кавычек или комментарии. Вы должны соответствовать всему тексту, начинающемуся с самого начала, потому что это единственный способ с Regex обеспечить, чтобы вы не нашли совпадения, в котором вы не должны.
Вот что я придумал, просто пытается обработать . Даже не цитирует. И это только доходит до определения от, а не того, что внутри него. Кроме того, мы должны предотвратить скобки скобок, поэтому у нас нет ужасного беспорядка при рассмотрении наших групп захвата для фактических предложений FROM.
(?:(?:-(?!-)|/(?!\*)|f(?!rom)|[^-f/])|--[^\n]*\n|/\*(?:\*/)*\*/)*from()
И это, вероятно, изобилуют ошибками, и я должен был бы переосмыслить все это, когда я играл с ним немного, и в целом, это будет гигантский трата времени.
Я думаю, что вы недооцениваете, насколько трудно достичь такой цели. Но есть совершенно надежное решение! Тот, который я дал выше: пусть SQL Server все анализирует для вас. Вы можете легко анализировать возвращенный план, потому что он структурирован таким образом, который облегчает его.
Когда я пытаюсь выполнить SELECT [\ D | \ d] * FROM (? [^ \ n] *) ', он находит одно совпадение, начинающееся с первого выбора и вплоть до последнего из. Вместо этого я хочу, чтобы он соответствовал всем выборам и возвращал все их имена таблиц. –
Alpay
Дайте сайту попробовать, всегда помогает мне при определении RegExes http://regexpal.com/ – Charleh
@Charleh, который предназначен для регулярных выражений Javascript. Для .NET вы должны использовать [RegexHero] (http://regexhero.net) –