在代码库中搜索对表名的引用

时间:2009-01-23 14:17:36

标签: parsing legacy-code

我有一个充满VB6应用程序遗留代码的目录。

我被要求提供此应用程序使用的所有表的列表,因此我们可以为其分配一个特殊的SQL Server用户名。

扫描代码库以获取对表名的引用的最佳方法是什么?

我有过一些想法:

  1. 搜索以下关键字: “FROM”,“UPDATE”,“INSERT”和 手动记下表名 围绕这些短语。

    问题:大量手工作业

  2. 使用SQL运行应用程序 追踪,并尝试锻炼每一个 功能,然后扫描日志 表名

    问题:手动工作相同,加上我可能会忽略一些模糊不清的功能

  3. 有人可以提出更好的选择吗?

1 个答案:

答案 0 :(得分:4)

我会从information_schema.tables中选择并将结果保存到文件以构建表列表,然后使用bat文件或命令行regex工具将表列表用作源代码目录中文件的比较源。你可以输出哪些文件有一个命中,以及命中了哪些表名(如果你感兴趣的话,命中的是哪一行)。我不是一个grep高手,但我认为这将是一种正确的工具。

修改 根据数据访问的处理方式,您可能希望扩展搜索列表以包含来自information_schema.routines的存储过程

编辑2方法使用finstr,光标,也许是黑暗的一面

请注意,虽然以下内容可行,但如果指向错误的目录,则可能会造成严重破坏。此外,只有从服务器访问源代码并启用xp_cmdshell时,它才有效。也许整个想法都是邪恶的,我不知道。

create table #files (filepath   varchar(4000))
create table #tablesfound (tablename sysname, filepath varchar(4000))

declare @sql nvarchar(4000)
Declare @cmd nvarchar(400)
Declare @dir varchar(256)
Declare @tbl sysname
set @dir = 'source code directory with e.g. c:\source\'
declare crsX cursor for
Select table_name from information_schema.tables
open crsX
Fetch Next from crsX into @tbl

While (@@Fetch_Status = 0)
Begin
    set @cmd = 'findstr /S /M '  + quotename(@tbl, char(34)) + ' ' + @dir + '*.*'

    insert into #files exec xp_cmdshell  @cmd
    if exists (Select 1 from #files where filepath is not null)
    Begin
        insert into #tablesfound (tablename, filepath)
        Select @tbl, filepath from #files where filepath is not null
        delete from #files 
    End  
    print @cmd
    Fetch Next from crsX into @tbl
End
close crsX 
Deallocate crsX

Select * from #tablesfound