0

我创建了一个程序,允许我在 SQL Server 生成的文本文件中搜索存储过程、函数、表等代码中的关键字。我正在寻找一种方法来找出在所有代码文件中引用了搜索词(即“ADMIN.TABLE”)的位置。我使用 LINQ 来查找引用。例如,当我搜索 ADMIN.TABLE 时,我将列出在文本中某处包含对搜索词“ADMIN.TABLE”的引用的文本文件的名称。但是,搜索不是绝对的,除非您包含 ADMIN.TABLE 的不同变体,否则您不会找到所有引用。所以找到我需要做这样的事情的所有参考:1)搜索“ADMIN.TABLE”2)搜索“[ADMIN].TABLE”3)搜索“ADMIN.[TABLE]”4)搜索“[ADMIN] 。[桌子]”

我正在考虑使用正则表达式模式,但我不确定如何构建一个涵盖上面列出的不同组合的模式。任何帮助,将不胜感激。

问候,

托尔

4

4 回答 4

2

我认为您可能正在重新发明轮子。你看过 sp_depends 吗?我将列出依赖于指定表的所有对象。

我意识到您正在使用文本文件,但是如果您可以生成 sp_depends 结果以及脚本,那可能会解决您的问题。

于 2009-06-05T14:28:46.407 回答
1

试试这个,它将遍历目录中的所有文件并使用不区分大小写的正则表达式扫描它们(您可以更改 Directory.GetFiles 调用以仅搜索目录而不通过更改搜索选项检查子目录):

        string pathWithSqlFiles = @"c:\sqlfiles\";
        string[] files = System.IO.Directory.GetFiles(pathWithSqlFiles, "*.sql", System.IO.SearchOption.AllDirectories);
        string regexToSearch = @"\[?admin\]?.\[?table\]?";
        foreach (string file in files)
        {
            string fileText = System.IO.File.ReadAllText(file);
            System.Text.RegularExpressions.Match match = System.Text.RegularExpressions.Regex.Match(fileText, regexToSearch, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
            if (match.Success)
            {
                // do logic to handle the matched text
            }
        }
于 2009-06-05T15:59:29.480 回答
0

诶……?表示匹配前一组 0 或 1 次。[ 和 ] 都有特殊的含义,所以你必须用 . 来转义它们。所以:

new Regex(@"\[?ADMIN\]?.\[?TABLE\]?")

你问就行。

于 2009-06-05T14:22:17.263 回答
0

如果您不知道如何去做,您可能需要解析 sql 脚本,然后使用对象模型专门找到 schema=admin && table=table。

选项 1:生成估计的查询计划并从中解析出表引用。如果您使用的是 sql 2005+,则可以将其作为 xml 获取并进行如下查询:

;WITH XMLNAMESPACES (default 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
select
    t.n.value('./@Database', 'sysname') as DatabaseName,
    t.n.value('./@Schema', 'sysname') as SchemaName,
    t.n.value('./@Table', 'sysname') as TableName,
    t.n.value('./@Column', 'sysname') as ColName
from @x.nodes('//ColumnReference') as t(n)
go

选项 2:

如果您想在客户端执行此工作并拥有 sql2008,请添加对 C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.SqlParser.dll 的引用并执行喜欢

    SqlScript script = Parser.Parse(@"create proc sp1 as select 'abc' as abc1");

然后你可以处理 script.Xml 并寻找一个节点,我相信你也可以在对象模型中找到它的强类型,因为我在程序集中看到了 SqlTableRefExpression,但我不确定在哪里下钻。

于 2009-06-05T16:41:13.320 回答