2015-07-13 114 views
0

我有一個複合SQL查詢。我只需要提取列名和它的別名。這些名稱應該與每個列名相對應地並排打印。
我可以在不連接數據庫的情況下執行上述問題嗎?獲取列名稱及其別名從c#中的sql查詢打印出來#

查詢:

SELECT ISNULL(DISTINCT COALESCE(ActivityName, 'BLANK'), 'NULLVALUE') AS ActName, ActivityPK Primary, ActCode Code, StartDt as ‘Start Date’, 
(SELECT ECODE FROM ActBCodes WHERE act.ActBCode_FK=BCodePK) ECode FROM TBL_TMX_Activity act 

輸出應該

ISNULL(DISTINCT COALESCE(ActivityName, 'BLANK'), 'NULLVALUE') ActName 

ActivityPK  Primary 

ActCode  Code   

StartDt  StartDate  

(SELECT ECODE FROM ActBCodes WHERE act.ActBCode_FK=BCodePK)  ECode 
+0

我想我在question.anyways提到的查詢是:SELECT ISNULL(DISTINCT COALESCE(ActivityName, '空白'), 'NullValue屬性')AS ActName,ActivityPK小學,ACTCODE代碼,StartDt「開始日期「, (選擇ECODE從ActBCodes WHERE act.ActBCode_FK = BCodePK)ECode FROM TBL_TMX_Activity act –

回答

0

是的,你可以寫拆分SQL起來的不同部分你自己的SQL語法分析程序。我警告過你,這可能會花費很多精力。

您可以使用ANTLR,它是一個解析器/詞法分析器工具。它的目標是識別「語言」,比如SQL。正如你可以看到here,已經有一些SQL語法。你可以使用它來解析你的SQL並得到想要的結果。

解決方案可能更容易爲您編寫,但更容易出錯的方法是使用正則表達式。如果你想讓它可靠,我會推薦ANTLR。

+0

yup,我試圖寫我自己的SQL解析器,但它只適用於此查詢不是通用的。所以我想知道的是有任何sql查詢可以獲取這些細節,如果我們通過連接到數據庫來做到這一點。 –

+0

不,沒有。 –

0
using System; 
using System.Collections.Generic; 
using System.Text; 

namespace columm_names 
{ 
    public class column 
    { 
     public static void Main() 
     { 

      string text = "SELECT ISNULL(DISTINCT COALESCE(ActivityName, 'BLANK'), 'NULLVALUE') AS ActName, ActivityPK Primary, ActCode Code, StartDt as ‘Start Date’, (SELECT ECODE FROM ActBCodes WHERE act.ActBCode_FK=BCodePK) ECode FROM TBL_TMX_Activity act"; 
      string s1,s2,text2; 
      string[] last_str,str; 
      int first = text.IndexOf("SELECT") + "SELECT".Length; 
      int last = text.IndexOf("AS"); 
      int count=0; 
      int index=0; 
      int x = 1;int i = 0; 
      char[] seperators = { ' ' }; 

      List<string> column_name = new List<string>(); 
      List<string> alias = new List<string>(); 

      while (text.Length!=0 && last >0) 
      { 
       text2 = sub_string(first,last,text); 
       if (x == 1) 
       { 
        column_name.Add(text2); 
        index = text.IndexOf(text2) + text2.Length+2;text = text.Remove(0, index); 
        index = text.IndexOf(","); 
        text2 = text.Substring(0, index); 
        alias.Add(text2); x = 0; 
       } 
       else 
       { 
        if (text2.IndexOf("as") > 0) 
        { 
         s1 = sub_string(first,text.IndexOf("as"),text); 
         column_name.Add(s1); 
         s2 = sub_string (text.IndexOf ("as") + 3, text.IndexOf (","), text); 
         alias.Add(s2); 
        } 
        else 
        { 
         str = text2.Split(seperators); 
         column_name.Add(str[0]); 
         alias.Add(str[1]); 
        } 
       } 
       index = text.IndexOf(text2) + text2.Length + 1;text = text.Remove(0, index); 
       first =1; 
       last = text.IndexOf(","); 

       if (last < 0) 
       { 
        last_str = text.Split(seperators); 
        text2=""; 
        while(i<last_str.Length) 
        { 
         if(count == 2){break;} 
         else {if(last_str[i]=="FROM"){count++;index =i;}} 
         i++; 
        } 

        for(i=0;i<index-1;i++){text2+=" "+last_str[i];} 
        column_name.Add(text2); 
        alias.Add(last_str[index-1]);break; 
       } 
      } 
      Console.WriteLine ("Column Names"); display (column_name); 
      Console.WriteLine("\n Alias");display (alias); 
     } 

     static string sub_string(int x,int y,string z) 
     { 
      string r =z.Substring(x, y-x); 
      return r; 
     } 

     static void display(List<string> lst) 
     { string[] arr = lst.ToArray(); 
      foreach(string s in arr){Console.WriteLine (s);Console.ReadLine();} 
     } 
    } 

}