2015-06-11 67 views
0

在過去的6個月中,我一直在努力編寫一個動態映射業務邏輯執行路徑的過程。SQL存儲過程解析

以前我沿着查看sys.sql_dependencies表的路線去找出執行流程,但是在程序中我們有條件邏輯來決定是否有一些程序被調用。

我這樣做,到目前爲止主要機制是輸出的程序規範到一個臨時表和輸出任何EXEC或IF邏輯內

DECLARE @TRAVERSAL_DEFINITION TABLE 
(
ROW_ID INT IDENTITY (1,1), 
SP_TEXT VARCHAR(MAX) 
) 

INSERT INTO @TRAVERSAL_DEFINITION 
(SP_TEXT) 
exec sp_helptext '[SCHEMA].[PROCEDURE]' 

SELECT TD_1.ROW_ID, 
     LTRIM(TD_1.SP_TEXT), 
     CASE WHEN LTRIM(SP_TEXT) LIKE 'IF%' THEN 1 ELSE 0 END, 
     CASE WHEN LTRIM(SP_TEXT) LIKE 'EXEC%' THEN 1 ELSE 0 END, 
     IF_START.ROW_ID, 
     IF_END.ROW_ID 
FROM @TRAVERSAL_DEFINITION TD_1 
CROSS APPLY (SELECT MIN(ROW_ID) AS ROW_ID 
       FROM @TRAVERSAL_DEFINITION TD_2 WHERE LTRIM(SP_TEXT) LIKE 'END%'    
       AND TD_2.ROW_ID > TD_1.ROW_ID) IF_END 
CROSS APPLY (SELECT MIN(ROW_ID) AS ROW_ID 
       FROM @TRAVERSAL_DEFINITION TD_2 
      WHERE LTRIM(SP_TEXT) LIKE 'BEGIN%' 
       AND TD_2.ROW_ID > TD_1.ROW_ID) IF_START 
WHERE (LTRIM(SP_TEXT) LIKE 'IF%' OR LTRIM(SP_TEXT) LIKE 'EXEC%') 
ORDER BY TD_1.ROW_ID 

有沒有人,如果過這個特殊的問題來了那麼你採取了什麼方法/解決方案?

謝謝。

回答

0

大問題 - 我希望你能使用C#(或任何.NET語言)

如果您創建一個SSDT項目並導入您的架構可以使用DacFx項目,這不正是你想要的東西 - 給你參考從一個對象到另一個對象。

有兩個主要部分供您參考,第一個是加載dacpacs的DacFx api,併爲您提供可查詢關係的TSqlModel。

第二部分是ScriptDom,它可以讓你解析一些SQL並檢索關鍵字和語句等內容。

有關示例見:

https://github.com/GoEddie/DacpacExplorer

如果你在引用特別感興趣的還有一個新的API https://github.com/Microsoft/DACExtensions這是更易於使用比現有的一個,所以我會建議你使用。

+0

不幸的是,由於我們的DBA團隊施加了限制,我們沒有權限創建我們開發數據庫的DacPac。 – Dataoverride

+0

大聲笑退出並去其他地方工作。 –

+0

如果生活只是那麼容易;-) – Dataoverride

1

在您選擇使用ScriptDom解析依賴關係的存儲過程的情況下,你會發現一個簡單的GUI工具,我創建有用:https://github.com/wangzq/TsqlScriptDom該工具是用F#本身,但一旦你有這方面的知識找到你的對象應該能夠很容易地在你自己的解析代碼中使用它。