2017-03-08 121 views
-2

我有一個存儲過程文本文件。我有很多表和列的名稱。如何從文本文件中提取單詞

如何從文本文件中獲取表名和列名。

例如

select t1.name, t2.roleid, t3.department, t4.country from dbo.user t1 inner join 
dbo.role t2 on t1.roleid = t2.roleid inner join dbo.tbldepartment t3 on t1.departmentid= t3.departmentid inner join dbo.country t4 on t1.countryid = t4.countryid 

結果

Table name => dbo.user 
Coulmn name => name 

table name => dbo.role 
column name =>roleid 

Table name => dbo.tbldepartment 
column name => departmentid 

Table name =>dbo.country 
column name => countryid 
+2

[s o]是*不是*免費代碼寫入服務。預計你會嘗試**自己編寫代碼**。在[做更多研究]之後(http://meta.stackoverflow.com/questions/261592),如果你有問題,你可以**發佈你已經嘗試過**的清單,說明什麼是不工作的**並提供[**最小,完整和可驗證示例**](http://stackoverflow.com/help/mcve)。我建議閱讀[問]一個好問題和[完美問題](http://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/)。另外,一定要參加[旅遊]。 – Igor

+0

表將是依賴關係。你可以連接到一個sql服務器實例並實際創建這些存儲過程,所以你最終可以訪問他們的AST嗎?如果您告訴我們您嘗試了什麼以及您有哪些工具/庫可以解決這個問題,它仍然可以成爲一個非常好的問題。 – dlatikay

+0

並詳細說明要求:您是限制單語句程序,還是它們可以是任何複雜的?我爲表和視圖做了一次,如果在列級別上有這種方法,我會做第二次。 – dlatikay

回答

-1

一些代碼...

string file = File.ReadAllText(@"E:\Projects\testApp\testApp\bin\Debug\file.txt"); 
string textAfterFrom = file.After(" from "); 
string textBeforeFrom = file.Before(" from "); 
string[] textArrayAfterSelect = textBeforeFrom.After("select").Split(','); 

List<ColumnTableRelation> ListofTable = new List<ColumnTableRelation>(); 
ColumnTableRelation objRel = new ColumnTableRelation(); 

string[] splitTables = textAfterFrom.Split('\n'); 

foreach (string tableNames in splitTables) 
{ 
    objRel = new ColumnTableRelation(); 
    if (!string.IsNullOrEmpty(tableNames) & !tableNames.Equals("\r")) 
    { 
     if (tableNames.Contains("dbo.")) 
     { 
      if (tableNames.Contains("inner join")) 
      { 
      objRel.Tablename = tableNames.Between("inner join", " on ").Trim(); 
      } 
      else 
      { 
      objRel.Tablename = tableNames.Before("\r").Trim(); 
      } 
     } 
     ListofTable.Add(objRel); 
    } 
} 

foreach (var item in ListofTable) 
{ 
    string[] stringArray = textArrayAfterSelect; 
    string value = item.Tablename.After(" "); 
    var matchingvalues = stringArray.Where(stringToCheck => stringToCheck.Contains(value)); 
    List<string> listString = new List<string>(); 
    foreach (var match in matchingvalues) 
    { 
     listString.Add(match); 
    } 
    item.ColumnNames = listString; 
} 
StringBuilder builder = new StringBuilder(); 
foreach (var item in ListofTable) 
{ 
    builder.Append(Environment.NewLine); 
    builder.Append("Table name => " + item.Tablename + Environment.NewLine); 
    foreach (var columns in item.ColumnNames) 
    { 
     builder.Append("Column name => " + columns + Environment.NewLine); 
    } 
} 
string yourResult = builder.ToString(); 
MessageBox.Show(yourResult); 

你會得到你的輸出這樣

enter image description here

你可以有你的擴展類SubstringExtensions從這個鏈接https://www.dotnetperls.com/between-before-after

而且到你的項目

public class ColumnTableRelation 
{ 
    public string Tablename { get; set; } 
    public List<string> ColumnNames { get; set; } 
} 

任何疑問,應理解

我與

嘗試過這種添加該類
select t1.name, t2.roleid, t3.department, t4.country from 
dbo.user t1 
inner join dbo.role t2 on t1.roleid = t2.roleid 
inner join dbo.tbldepartment t3 on t1.departmentid= t3.departmentid 
inner join dbo.country t4 on t1.countryid = t4.countryid 
+0

謝謝。該代碼工作正常。但是作品小查詢。如果我有子查詢或插入語句。我無法獲得價值。請給這個 –

+0

例子@balaji的建議? –

+0

我有我的存儲過程中的子查詢,更新語句,插入語句和刪除查詢 –