2011-03-09 31 views
1

我有一個情況,我有幾百個複雜的Excel電子表格,每個電子表格都有多個數據透視表,針對sql數據庫運行查詢。我需要能夠將這些sql查詢轉換爲針對專有數據存儲的函數調用。這在很多層面上都很複雜,但我現在所討論的部分似乎已經在計算機科學中解決過了,那就是如何將sql語句「解析」爲一個定義良好的結構,以便我可以通過編程方式進行工作。解析現有的「複雜」SQL語句並轉換爲調用自定義API調用

我的出發點的例子:

SELECT vwFlowDataBest.MeasurementDate, vwFlowDataBest.LocationType, vwFlowDataBest.ScheduledVolume, tblPoints.Zone, tblPoints.Name AS SOME_ALIAS_FOR_NAME, vwFlowDataBest.PointID, tblCustomerType.Name, vwFlowDataBest.OperationallyAvailable, tblPoints.County, tblPoints.State, tblConnectingParty.Name 

FROM Pipe2Pipe.dbo.tblConnectingParty tblConnectingParty, Pipe2Pipe.dbo.tblCustomerType tblCustomerType, Pipe2Pipe.dbo.tblPipelines tblPipelines, Pipe2Pipe.dbo.tblPoints tblPoints, Pipe2Pipe.dbo.vwFlowDataBest vwFlowDataBest 

WHERE tblCustomerType.ID = tblPoints.CustomerTypeID AND tblPipelines.ID = vwFlowDataBest.PipelineID AND tblPoints.ID = vwFlowDataBest.PointID AND tblPoints.ConnectingPartyID = tblConnectingParty.ID AND ((tblPipelines.ID=16) AND (vwFlowDataBest.ScheduledVolume<>0) AND (tblPoints.Zone In ('mid 1','mid 2','mid 3','mid 4','mid 5','mid 6','mid 7')) AND (tblCustomerType.ID=16) AND (vwFlowDataBest.MeasurementDate>={ts '2010-05-15 00:00:00'}) AND (tblPipelines.ID<155)) 

因此,對於這個說法,我需要以編程方式處理SELECT部分​​中,FROM部分,和where部分,並在每個下屬。這種併發症是別名等問題,區分表之間的連接和where子句中的普通舊值過濾器,where子句中的分組(括號)以及其他問題。處理Excel數據透視表的複雜性完全超出了這個問題的範圍,我可以弄清楚。

就目前而言,我不介意支持某些SQL函數,如「按組」,「具有」,等等......我的問題,這些是足夠小,如果有必要,我可以處理那些手動。但如果有一種已知的方法來處理這個問題,我會很開心。

我的感覺是,我可以通過將sql語句分成3個部分,然後進一步將每個部分分解爲其邏輯從屬部分,然後處理他們相應。但是,當我寫這篇文章的時候,我已經看到了我的計劃中的漏洞......這感覺就像是複雜性和邊緣案例的一個焦點。

我無法想象自己是第一個想要做這種事情的人,所以我的問題是,是否存在針對此類問題的陳舊方法,現有的圖書館,我可以採取的創新方法,或者任何建議一般適用於這項任務?

回答

3

您似乎需要一個SQL解析器(或至少是其中的一部分)。這可能是爲你的目的矯枉過正(比你需要更完整),但ANTLRPL/SQL parser可能是有用的。

編輯:我沒有真正閱讀這個語法,因爲我在發佈該鏈接之前應該仔細閱讀。做一點看,它根本不真正解析選擇語句 - 它只是識別它在哪裏,並跳過它。

雖然ANTLR grammars page列出了更多的SQL語法(對於MySQL,Oracle等支持/使用的變體)。由於標籤中包含C#等,因此猜測您想要解析MS SQL服務器變種。嚴格按select聲明嚴格執行grammar,這可能是您的需求的合理選擇。