2012-09-18 32 views
3

我有一個查詢腳本是這樣的:解析SQL查詢,並拉出列名和表名

SELECT View1.OrderDate,View1.Email,SUM(View1.TotalPayments)FROM dbo.View1 WHERE( View1.OrderStatus ='Completed') GROUP BY View1.OrderDate,View1.Email HAVING (SUM(View1.TotalPayments)> 75);

是否有任何方法可以從SQL查詢中提取一些關鍵信息?如表名和列名,我有2個問題:

  1. 我做的搜索,我發現了一些解析器如ANTLR,但我不能 找到文檔解釋了使用該解析器在C#語言。
  2. 有什麼辦法可以使用Entity Frame Work來解析sql查詢嗎?我的查詢是完全動態的,它們在運行時
+0

您可以使用'information schema'表並使用它來構建動態sql,這樣您就可以知道哪些列和表用於創建sql。 –

+0

我需要從SQL查詢中提取信息。 –

+0

你是說你有一個你想解析的SQL查詢的TEXT - 不執行?關於連接,多列等等? – n8wrl

回答

3

我認爲最好的答案將是使用反諷解析器: http://irony.codeplex.com/

Hanselman有一個偉大的鏈接如何使用它來解析SQL: http://www.hanselman.com/blog/TheWeeklySourceCode59AnOpenSourceTreasureIronyNETLanguageImplementationKit.aspx

我希望這可以幫助,祝你好運!

+0

我使用了「Ben Laan」Sql Parser,這聽起來不錯,這裏 - > [Ben Laan SQL Parser「](http: //code.google.com/p/sqlformat/downloads/detail?name=Laan%20Sql%20Tools%20Src%20v1.1.zip&can=2&q=),但請記住我們需要直接連接到數據庫的任何額外查詢例如,當我們需要找出哪個列屬於哪個表時 –

+0

非常好!它是怎麼回事?你能夠完成你對解析器的設置嗎? –

-1

你可以建立在實體框架動態查詢這樣

If(case1) 
{ 
    var query = db.x.where(x => x).toList(); 
} 
else 
{ 
    var query = db.x.where(y => y).toList() 
} 
+2

謝謝,但我沒有詢問有關查詢building.I已經查詢,我需要從SQL查詢中提取信息。 –

+0

我打算使用正則表達式來提取表名和列名:[link](http://stackoverflow.com/questions/4214045/using-regex-to-extract-table-names-from-a-file- contains-sql-queries) –

1

你可以使用一些系統表來獲取你的信息創建尋找。

select p.name ParentTable, r.name ReferencedTable, k.name KeyName 
from sys.foreign_keys k 
join sys.tables p on k.parent_object_id = p.object_id 
join sys.tables r on k.referenced_object_id = r.object_id 

取決於您的數據庫的一致性,您可以假設密鑰名稱是什麼。因此,如果參考表是[User],則可以假定您正在引用UserId,如果您的表中有多個鍵,則這不會是您正在尋找的答案。

+0

我們需要將這個解決方案與解決方案@Maurice所提到的相混淆,如果我們要確保一列屬於一個表,我們需要對sys數據庫進行一些查詢。我們可以從給定的SQL腳本中提取表名和列名,但是如果想要確定哪些列屬於哪個表,那麼我們需要在系統表和列上使用查詢。 –

+0

我喜歡這個sql解析器項目,它是由「Ben Laan」開發的,我用這個解析器來解決我需要的,你可以從[Here]下載(http://code.google.com/p/sqlformat/downloads /detail?name=Laan%20Sql%20Tools%20Src%20v1.1.zip&can=2&q=) –