5

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

输出应该类似于 TableA columnA columnC columnD

表B列E列F列G

我用Database Edition GDR写了一个小应用,有兴趣的可以参考http://tsqlparsergdr.codeplex.com

4

6 回答 6

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 扩展,会有些繁重的工作)

于 2008-11-12T07:29:02.357 回答
1

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

于 2008-11-19T15:51:20.790 回答
1

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

谢谢大家的回复。

于 2008-12-19T16:06:10.603 回答
1

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

于 2010-08-29T23:44:16.680 回答
0

sp_depends 应该有帮助

于 2008-11-19T18:33:13.367 回答
-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

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

于 2008-11-12T07:55:13.803 回答