Sql server 存储过程的SQL表和列解析器

Sql server 存储过程的SQL表和列解析器,sql-server,stored-procedures,sql-server-2000,Sql Server,Stored Procedures,Sql Server 2000,是否有一个应用程序可以解析一组给定的存储过程(SQLServer2000),并获取其中使用的所有表和相关列。 存储过程可以具有来自不同数据库的表 输出应该是 表 圆柱 柱状 柱状 表B 专栏 专栏 专栏 我已经使用数据库版GDR编写了一个小应用程序,任何感兴趣的人都可以参考 更新-2009年1月20日* Visual Studio DB Professional Edition附带了完整的T-SQL脚本DOM解析器 这不是一个具体的解决方案,而是一个思路 将sysdepends视为一个潜在的

是否有一个应用程序可以解析一组给定的存储过程(SQLServer2000),并获取其中使用的所有表和相关列。 存储过程可以具有来自不同数据库的表

输出应该是 表 圆柱 柱状 柱状

表B 专栏 专栏 专栏

我已经使用数据库版GDR编写了一个小应用程序,任何感兴趣的人都可以参考
  • 更新-2009年1月20日*
  • Visual Studio DB Professional Edition附带了完整的T-SQL脚本DOM解析器
  • 这不是一个具体的解决方案,而是一个思路

    将sysdepends视为一个潜在的解决方案,但它在包含所有依赖对象信息方面是出了名的不可靠

    但是Lex/Yacc派生的东西呢?有一些商业解析器,例如

    我没有寻找开源实现,但我想我会寻找这条路线。以下是我如何开始搜索的:

    ANSI SQL的BNF语法可在此处找到:


    选择lex实现后,这似乎是一个相对直接的工程问题。(如果您想支持MS SQL扩展,可以使用一些重载)

    您可以以编程方式调用存储过程(在开发环境中)并获取结果列。为了避免调用insert和update过程,您可能有一个命名约定。您还必须找到设置正确参数的方法

    注意:由于存储过程(can)的工作方式,我认为100%可靠的解决方案在技术上是不可能的

    看看这个例子:

    [...]
    @MyDate datetime
    
    AS
    
        IF (day(@MyDate) = 1)
        BEGIN
            SELECT * FROM MyFirstTable
            RETURN
        END
    
        IF (@MyDate > getdate())
            SELECT MyID, MyText FROM MySecondTable WHERE ADate > @MyDate
        ELSE
            EXEC Other_StoredProcedure @MyType, @MyDate
    

    因此,有两个问题:结果列可能不同,您必须递归地遵循其他存储过程。

    您可以使用设置并解析输出。

    sp_dependens应该会有帮助。

    决定使用Regex创建一个小应用程序,以满足我当前的需要


    谢谢大家的回复。

    sp\u对我来说非常有效。
    它显示了哪些表或SP可能会受到我的更改的影响

    对输出的解析有太多的缺陷。同意一般注意事项tho’——假设您要解析所有显式声明的proc,那么仍然有可能通过动态SQL字符串隐式调用过程,您必须再次解析动态SQL字符串等。对不起,可能我不清楚。我的意思不是“解析”输出,而是以正常的方式获取结果列,只需调用存储过程。我会修改我的答案。好吧,也许我误解了这个问题。但我不清楚rsapru所说的“告诉我该表中的所有表和列都在使用什么”是什么意思。很抱歉我的解释,我只是想让应用程序获得所有表和相关列,因为输出看起来很好,但无法购买。需要某种开源或免费软件。O'Reilly的YACC&Lex书中有一个基于YACC的SQL解析器示例。()您可以找到其他公共实现。一个商业产品的存在告诉你它是一种稀缺资源。最终,我们能够使用数据库版GDR创建一个。。嘿,rsapru,感谢您抽出时间再次登录-很高兴您使用了DB Edition解析器。。。节日快乐!请定义“不起作用”。或者更好-定义什么工作:)为什么它对我不工作是因为我正在处理的大多数存储过程,我没有它们所引用的所有数据库。而SHOWPLAN_似乎只有在所有DB都在场的情况下才起作用。这是我需要做的一种分析工作,现在效果好多了(SQLServer2008)。Q被标记为SQL Server 2000,尽管其中的依赖关系非常不恰当。我认为正则表达式不是正确的解决方案,您需要一个SQL解析器,请参阅本文: