0

いくつかのストアド プロシージャの DDL 定義、テーブル、トリガー、ビューなどのステートメントの変更を含む .sql ファイルがあります。

次のようなステートメントを含めることができます。

  • プロシージャの作成 / プロシージャの作成
  • ALTER PROC / ALTER PROCEDURE
  • DROP PROC / DROP PROCEDURE
  • テーブル/トリガー/ビューの作成
  • テーブル/トリガー/ビューの変更
  • ドロップ テーブル/トリガー/ビュー

.sql ファイルを解析し、オブジェクトのリスト (Proc/Table/View 名) とそれらに対して実行されているアクション (ALTER/CREATE/DROP) を取得する最良の方法は何ですか? Microsoft.Data.Schema.ScriptDom や ANTLR などのパーサーを使用する代わりに、RegEx を使用するのが最も簡単な方法だと考えています。しかし、すべてのシナリオをカバーするどの種類の RegEx を作成すればよいかわかりません。

これまでのところ、この式は上記のすべてのルールに一致することができます。しかし、その前にあるオブジェクトの名前を取得するにはどうすればよいですか。例えば。一致する

(create|alter|drop)\s+(procedure|proc|table|trigger|view|function|constraint)

私の質問は、AdvisorGroups という名前を取得する方法です。[dbo] を持つ可能性があるため、私の RegEx も不完全です。その前かどうか。Alter table AdvisorGroups の可能性もあります。すべての可能性を考慮しようとしているわけではありません。最低限のことだけ。

ALTER TABLE [dbo].[AdvisorGroups] 制約を追加 [XXX]

-前もって感謝します

4

2 に答える 2

3

正規表現は仕事を成し遂げません-間違いなく...あなたは本当のパーサーを必要とするでしょう-これのようなもの(商用)。

于 2013-02-15T21:49:03.517 に答える
1

私はそれを自分で解決しました。それが誰かを助けることを願っています。したがって、ALTER、DROP、CREATE PROC/TABLE/TRIGGER/FUNCTION の寄せ集めを含む文字列の場合、

    Regex DDL = new Regex(@"(?<=\b(create|alter|drop)\s+(procedure|proc|table|trigger|view|function)\b\s\[dbo\].)\[.*?\]", RegexOptions.IgnoreCase);
    Match match = DDL.Match(inputScript);
    while(match.Success)
    {
        textBox2.Text += "\r\n" + match.Groups[1].Value + " - " + match.Groups[2].Value + " - " +  match.Value;
        match = match.NextMatch();
    }
    textBox3.Text = "DONE";

このような出力が得られます。

  • 作成 - 表示 - vwEmployees
  • CREATE - TABLE - tblSalaries
  • ドロップ - PROC - spGetEmployees
  • ALTER - TABLE - tblSalaries

このコードの素晴らしい点は、影響を受けるオブジェクトを提供するだけでなく、オブジェクトの種類 (テーブル、プロシージャ、ビューなど) と操作 (作成/変更/削除など) も提供することです。これらはすべて、matchs[1]、matchs[2] などで利用できます。

于 2013-02-15T23:30:08.210 に答える