すべてのクエリにテーブルが 1 つしかない場合や、コメントを使ったおかしなビジネスがない場合を除き、これに正規表現を使用することは命題を失います。その代わり:
SET SHOWPLAN_ALL ON;
--All your queries here
set showplan_allドキュメントを参照してください。
正規表現が複雑になるというのは、そういう意味です。これらは考慮事項の一部にすぎません。
引用符で囲まれた文字列の開始を検出する必要があり"
ます。終了文字が 2 重になっている場合は終了しません (つまり、 の後に停止しません)。'
[
'this is ''fun'', he said'
is
引用符で囲まれていない単一行のコメントを除外--
し、次の CRLF で終了する必要があります。コメント内の引用符は、通常どおり文字列を開始しません。
引用符内または単一行のコメント内にない複数行のコメント ( で始まる/*
) を除外し、ターミネータ以外のすべてをスキップする必要があります*/
。正規表現では、必ず*
バックスラッシュで文字をエスケープしてください\
。
次に、適切な単語境界を持つ有効な句を見つける必要があります(たとえば、列名またはでFROM
誤った一致はありません)。SelfRom
AfroMonkey
FROM 句を適切に終了するWHERE
には、、、、、および;GROUP BY
を含むキーワードが表示されたらキャプチャを停止する必要があります。また、SQL クエリにはセミコロン ターミネータが必要ないため、、、、、、などで終了する必要があります。HAVING
ORDER BY
WITH
;
SELECT
DBCC
SET
CREATE
ALTER
DROP
しかし、前の 2 つのポイントでさえ、それだけでは十分ではありません。クエリが次のようになっている場合はどうでしょうか。
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 句のキャプチャを停止しないでください。そして、括弧の深さを追跡し、その数になるまで無視し続ける必要があります。そして最後に、これらをどうするかというと、派生テーブルはテーブルと同じようなものなので、派生テーブルの全文が必要なのか、それともその中のテーブルだけが必要なのか?
これをすべて行うには、テキスト内の最初の有効な場所から照合を開始するだけではいけませんFROM
。これは、引用符またはコメント内にある可能性があるためです。最初からすべてのテキストを一致させる必要があります。それが、正規表現で一致すべきでない場所を見つけないようにする唯一の方法だからです。
これが私が思いついたもので、コメントを処理しようとするだけです。引用すらありません。そして、そこにあるものではなく、 from句を見つけるところまでしか行きません。さらに、実際の FROM 句のキャプチャ グループを調べるときに混乱が生じないように、括弧によるキャプチャを防止する必要があります。
(?:(?:-(?!-)|/(?!\*)|f(?!rom)|[^-f/])|--[^\n]*\n|/\*(?:\*/)*\*/)*from()
そして、おそらくエラーがはびこっていて、少し遊んだら全体を再考する必要があり、全体として、それは膨大な時間の無駄になります.
あなたは、そのようなことをうまく成し遂げるのがどれほど難しいかを過小評価していると思います。しかし、完全に信頼できる解決策があります。上で示したもの: SQL Server にすべてを解析させます。返されたプランは簡単に解析できるように構造化されているため、簡単に解析できます。