0

長い sql クエリを含むランダムな .sql ファイルがあります。配列に入れるには、insert sql ステートメントからすべてのテーブル名を実行時に取得する必要があります。以下の形式のように挿入ステートメントが (1 行) にある場合、テーブル名 (Inventory.tableA) を取得できます。

...
Insert into Inventory.tableA;
...

ただし、Insert ステートメントが以下のように複数行にある場合

Insert into 
Inventory.tableA;

また

Insert into 
(blank line)
(blank line)
Inventory.tableA;

次に、テーブル名を取得するクエリが失敗します。挿入ステートメントが1行または複数行の長いSQLクエリからテーブル名を取得する方法を教えてください。ここで最善のアプローチは何ですか?

以下は、1行で処理できるc#クエリです。

public List<string> GetAllTablesNames(string sp)
        {
            List<string> output = new List<string>();

            string[] contentSplit = sp.Split(new string[] { "INSERT INTO " }, StringSplitOptions.None);
            for (int a = 1; a < contentSplit.Length; a++)
            {
                string[] sa_tableName = contentSplit[a].Substring(0, contentSplit[a].IndexOf("\r")).Trim().Split('.');

                    output.Add(sa_tableName[0] + "." + sa_tableName[1]);
            }

            return output.Distinct().ToList();
        }
4

3 に答える 3

2

使用singlelineモード

List<string> tables= Regex.Matches("yourInput",@"Insert into\s+(.*?)[\s\(]+"
,RegexOptions.Singleline|RegexOptions.IgnoreCase)
.Cast<Match>().Select(x=>x.Groups[1].Value)
.ToList<string>();

//tables contains all the table names
于 2012-10-23T14:57:13.450 に答える
1

\ sはすべての空白を無視するため、\ s +を使用すると、タブとCRLFがスキップされます。あなたの例には;があったので、;ではないすべてのテキストをキャプチャします。間にスペースがある場合は、代わりに[^; \s]+を使用してください。

string text = @"Insert into  
    Inventory.tableA;
    Insert into Orders;";

    var tableNames = Regex.Matches(text, @"(?:Insert into\s+)(?<Name>[^;]+)(?:;)")
                          .OfType<Match>()
                          .Select (mt => mt.Groups["Name"].Value);

    Console.WriteLine ("Tables: {0}", string.Join(" ", tableNames));            

    /* Tables: Inventory.tableA Orders */
于 2012-10-23T18:50:00.060 に答える
1

あなたの正規表現が何であるかはわかりませんが、次のことができます。

  1. 正規表現のすべてのスペースをに変更します\s+
  2. すべてのエンドラインを最初に置き換え" "てから、正規表現を実行します。
于 2012-10-23T14:58:05.240 に答える