2015-06-11 69 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#本身,但一旦你有这方面的知识找到你的对象应该能够很容易地在你自己的解析代码中使用它。