0

我有一个目录,里面全是来自 VB6 应用程序的遗留代码。

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

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

我的一些想法:

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

    问题:大量的手工工作

  2. 使用 SQL Trace 运行应用程序,并尝试执行每个函数,然后扫描日志以查找表名

    问题:同样的手工工作,另外我可能会忽略一些晦涩的功能

任何人都可以提出更好的选择吗?

4

1 回答 1

4

我将从 information_schema.tables 中选择并将结果保存到文件以构建表列表,然后使用 bat 文件或命令行正则表达式工具将表列表用作与源代码目录中的文件进行比较的源。您可以输出命中的文件和命中的表名(如果您有兴趣,命中在哪一行)。我不是 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
于 2009-01-23T14:29:22.577 回答