0

SQL Server で生成されたテキスト ファイルのストアド プロシージャ、関数、テーブルなどのコード内のキーワードを検索できるプログラムを作成しました。すべてのコード ファイルで検索用語 (つまり、「ADMIN.TABLE」) が参照されている場所を見つける方法を探しています。LINQ を使用して参照を見つけます。たとえば、ADMIN.TABLE を検索すると、テキストのどこかに検索用語「ADMIN.TABLE」への参照を含むテキスト ファイルの名前。ただし、ADMIN.TABLE のさまざまなバリエーションを含めない限り、すべての参照を見つけることができないという点で、検索は絶対的なものではありません。したがって、次のようなことをする必要があるすべての参照を見つける: 1) "ADMIN.TABLE" を検索する 2) "[ADMIN].TABLE" を検索する 3) "ADMIN.[TABLE]" を検索する 4) "[ADMIN] を検索する。[テーブル]"

正規表現パターンを使用することを考えていますが、上記のさまざまな組み合わせをカバーする正規表現パターンを作成する方法がわかりません。どんな助けでも大歓迎です。

よろしく、

トア

4

4 に答える 4

2

車輪を少し再発明している可能性があると思います。sp_depends を見たことがありますか? 指定したテーブルに依存するすべてのオブジェクトを一覧表示します。

テキスト ファイルで作業していることは承知していますが、スクリプトと共に sp_depends の結果を生成できれば、問題が解決する可能性があります。

于 2009-06-05T14:28:46.407 に答える
1

これを試してください。ディレクトリ内のすべてのファイルをループし、大文字と小文字を区別しない正規表現を使用してスキャンします(検索オプションを変更することで、サブディレクトリをチェックせずにディレクトリのみを検索するようにDirectory.GetFiles呼び出しを変更できます)。

        string pathWithSqlFiles = @"c:\sqlfiles\";
        string[] files = System.IO.Directory.GetFiles(pathWithSqlFiles, "*.sql", System.IO.SearchOption.AllDirectories);
        string regexToSearch = @"\[?admin\]?.\[?table\]?";
        foreach (string file in files)
        {
            string fileText = System.IO.File.ReadAllText(file);
            System.Text.RegularExpressions.Match match = System.Text.RegularExpressions.Regex.Match(fileText, regexToSearch, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
            if (match.Success)
            {
                // do logic to handle the matched text
            }
        }
于 2009-06-05T15:59:29.480 に答える
0

どのように処理するかが決まっていない場合は、SQL スクリプトを解析してから、オブジェクト モデルを使用して schema=admin && table=table を具体的に検索することをお勧めします。

オプション 1: 推定クエリ プランを生成し、そこからテーブル参照を解析します。SQL 2005 以降を使用している場合は、xml として取得し、次のようにクエリできます。

;WITH XMLNAMESPACES (default 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
select
    t.n.value('./@Database', 'sysname') as DatabaseName,
    t.n.value('./@Schema', 'sysname') as SchemaName,
    t.n.value('./@Table', 'sysname') as TableName,
    t.n.value('./@Column', 'sysname') as ColName
from @x.nodes('//ColumnReference') as t(n)
go

オプション 2:

クライアント側でこの作業を行い、sql2008 を使用する場合は、C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.SqlParser.dll への参照を追加して実行します。お気に入り

    SqlScript script = Parser.Parse(@"create proc sp1 as select 'abc' as abc1");

次に、script.Xml を処理してノードを探します。アセンブリに SqlTableRefExpression があるので、オブジェクト モデルでも強く型付けされていることがわかると思いますが、どこにドリルダウンすればよいかわかりません。

于 2009-06-05T16:41:13.320 に答える
0

え…?前のグループに 0 回または 1 回一致することを意味します。[ と ] はどちらも特別な意味を持つため、 でエスケープする必要があります。そう:

new Regex(@"\[?ADMIN\]?.\[?TABLE\]?")

あなたが尋ねればそうするでしょう。

于 2009-06-05T14:22:17.263 に答える