SQL表和列Parser用于存储过程

时间:2008-11-12 07:03:41

标签: sql-server stored-procedures sql-server-2000

是否有一个应用程序,它可以解析给定的一组存储过程(SQL Server 2000)并获取正在其中使用的所有表和关联列。 存储过程可以包含来自不同数据库的表。

输出应该是这样的 表A    columnA    columnC    columnD

表B    columnE    columnF    columnG

我使用数据库版GDR编写了一个小应用程序任何感兴趣的人都可以参考http://tsqlparsergdr.codeplex.com

6 个答案:

答案 0 :(得分:2)

不是具体的解决方案 - 而是一种思路。

将sysdepends视为一种潜在的解决方案 - 但在包含所有依赖对象信息时,这是非常不可靠的。

但Lex / Yacc衍生出来的是什么?有一些商业解析器,例如

  

http://www.sqlparser.com/download.php

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

  

http://www.google.com/search?hl=en&q=sql+lex+yacc+parse

ANSI SQL的BNF语法可以在这里找到:

  

http://savage.net.au/SQL/

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

谢谢大家的回复。

答案 3 :(得分:1)

sp_depends非常适合我。 它显示了我的更改可能会影响哪个表或SP

答案 4 :(得分:0)

sp_depends应该有帮助

答案 5 :(得分:-1)

您可以以编程方式调用存储过程(在开发环境中)和获取结果列。也许你有一个命名约定,以避免调用插入和更新过程。你必须找到设置正确参数的方法。

注意:我认为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

所以有两个问题:结果列可能不同,你必须按递归方式跟随其他存储过程。