0

我有一个带有长 sql 查询的随机 .sql 文件。我需要运行时从插入 sql 语句中获取所有表名以放入数组中。如果插入语句在(一行)中,我可以获取表名(Inventory.tableA),如下所示:

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

但是,如果插入语句在多行中,如下所示

Insert into 
Inventory.tableA;

或者

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

然后我检索表名的查询将失败。您能否建议我如何从长 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

我不确定你的正则表达式是什么,但你可以:

  1. 将正则表达式中的所有空格更改为\s+.
  2. 用 first 替换所有 endlines " ",然后通过你的正则表达式运行它。
于 2012-10-23T14:58:05.240 回答
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 回答