2012-10-23 90 views
0

我有一个随机的.sql文件与长的sql查询。我需要运行时从insert sql语句中获取所有表名以放入数组中。我能够得到表名(Inventory.tableA)出来,如果插入语句是(一行),如以下格式:匹配不同字符串格式的字符串

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

但是,如果INSERT语句是多行像下面例如

Insert into 
Inventory.tableA; 

OR

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(); 
     } 
+2

请向我们展示在单行上起作用的查询,并使您的问题标题更有意义。 –

+0

'Insert into Inventory.tableA'本身就是错的,它不能按原样执行。包括换行符在内的空格将被忽略,因此导致错误的可能性不大。也许你正在单独阅读和执行每一行? –

回答

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 
1

我不知道你的正则表达式是什么,但你可以:在你的正则表达式来\s+

  1. 更改的所有空间。
  2. 首先用" "替换所有的端点,然后通过你的正则表达式运行它。
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 */