2009-01-23 37 views
0

我有一個目錄充滿了來自VB6應用程序的遺留代碼。搜索代碼庫以查找表名稱

我被要求提供這個應用程序使用的所有表的列表,所以我們可以給它分配一個特殊的SQL Server用戶名。

掃描代碼庫以引用表名稱的最佳方式是什麼?

一些想法我有:

  1. 搜索以下關鍵字: 「FROM」, 「更新」, 「插入」,並 手動注意表名(S) 周圍的那些短語。

    問題:體力勞動

  2. 大量的運行與SQL 跟蹤的應用程序,並嘗試運用各 功能,然後掃描日誌 表名

    問題:同手動工作,再加上我可能會忽略一些不起眼的功能

任何人都可以提出更好的選擇嗎?

回答

4

我會從information_schema.tables中選擇並將結果保存到文件以構建表格列表,然後使用bat文件或命令行正則表達式工具將表格列表用作源代碼來對照源代碼中的文件進行比較目錄。你可以輸出什麼文件有一個命中,什麼表名被命中(如果你感興趣的話,命中的是哪一行)。我不是一個grep高手,但我認爲這將是正確的使用工具。

編輯 根據數據訪問是如何處理的,你可能想擴大搜索列表使用finstr,遊標包括INFORMATION_SCHEMA.ROUTINES

編輯2方法存儲的特效,也許黑暗的一面

請注意,雖然下面應該工作,如果指向錯誤的目錄,它可能會造成嚴重破壞。此外,只有源代碼可從服務器訪問並啓用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 
+0

我喜歡它。我會盡力並接受你的答案,如果它解決了。 – JosephStyons 2009-01-23 14:51:27