6

特定の文字列 (この場合は電子メール アドレス) について何千ものストアド プロシージャと関数を検索しようとしていますが、コメント ブロックにある場合は無視したいと考えています。

これはオブジェクトを検索するための SQL 構文ですが、何百もの結果があり、電子メール アドレスがコードで使用されているのか、それとも単にコメント ブロックで使用されているのかを判断するために、それぞれを調べたくありません。

SELECT DISTINCT
  o.name objectname
FROM sys.sql_modules m
  INNER JOIN sys.objects o 
    ON m.object_id = o.object_id
WHERE definition LIKE '%somebody@somewhere.com%'
ORDER BY o.name

正規表現を使用できる CLR ライブラリ (SQLSharp) がありますが、コメントと有効なコードを識別する正規表現がわかりません。

RegEx に精通していて SQL Server に精通していない場合、コメントは 2 つのダッシュ (例: --) で始まる 1 行、または /* で始まり */ で終わる複数の行として定義されます。

これを理解しようと考えるだけで、頭が痛くなります。

4

3 に答える 3

2

これは、SQL Server Central の記事に投稿したコードを使用して実行できます。

オブジェクトからテキストを検索する

その記事で説明されているストアド プロシージャには、インライン ( ) コメント--とブロック ( /* ... */) コメントの両方を無視する機能があるだけでなく、一重引用符内のテキストも無視できます。このコードは、影響のないテキストを検索する可能性が低いため、コメントを無視するオプションをデフォルトで True に設定しています。ただし、文字列を無視するためのデフォルトは False です。これは、動的 SQL と、文字列に入れることができるその他のテキストがまだ有効であり、最終的に実行可能なコードである可能性があるためです。

NVARCHAR(MAX)このコードは SQL Server 2000 用に開発されたものであるため、実際に役立つ 1 つか 2 つの場所では使用されていません。それ以来、NVARCHAR(MAX)代わりに使用するコードを更新したNVARCHAR(4000)ため、単一の一時テーブルを使用しましたが、それらの変更で記事を更新していません。私はこれらのいずれかをしようとします。また、この記事のコードは 1 つのデータベースを参照するのに対し、更新されたコードは、指定されていない場合、アクセス可能なすべての DB を参照すると思います。

于 2013-06-10T23:16:36.733 に答える
0

次の正規表現を使用して、両方の種類のコメントを識別できます

(--.*?\n)|(/\*.*?\*/)

.複数行のコメントを識別するために、改行も一致することを確認してください

\r一部のシステムでは が改行文字として扱われ、一部のシステムでは の組み合わせが改行文字であることに注意してください\r\n

于 2012-08-13T06:21:54.563 に答える
0

私の ModuleStore プロジェクトのパーサー コンポーネントを使用できます。これは、渡した SQL から構文ツリーを作成します。このツリーは、プログラムで照会および変更できます。

http://code.google.com/p/bsn-modulestore/

于 2012-08-13T06:39:42.983 に答える