如何查找具有特定字符串的代码,但不能在注释中查找

时间:2012-08-13 04:44:39

标签: sql-server regex

我正在尝试搜索特定字符串的1,000个存储过程和函数(在本例中是一个电子邮件地址),但我想在注释块中忽略它。

这是查找对象的SQL语法,但有数百个结果,我不想通过每个结果来确定电子邮件地址是在代码中还是仅在注释块中使用。

SELECT DISTINCT
  o.name objectname
FROM sys.sql_modules m
  INNER JOIN sys.objects o 
    ON m.object_id = o.object_id
WHERE definition LIKE '%somebody@somewhere.com%'
ORDER BY o.name

我有一个CLR库(SQLSharp),我可以使用正则表达式,但我不确定正则表达式是否可以识别注释与有效代码。

对于那些精通RegEx且不精通SQL Server的人,评论被定义为以两个破折号(例如 - )开头的单行或以/ *开头并以* /

结尾的多行

想到弄清楚这一点会让我的大脑受伤。

3 个答案:

答案 0 :(得分:2)

这可以使用我在SQL Server Central上发表的文章中发布的代码来完成:

Searching Objects for Text

该文章中描述的存储过程不仅可以忽略内联(--)和阻止(/* ... */)注释,还可以忽略单引号内的文本。代码默认选项忽略对True的注释,因为它似乎不太可能想要搜索非影响文本。但忽略字符串的默认值为False,因为动态SQL和其他一些可以进入字符串的文本可能仍然是有效的可执行代码。

该代码是为SQL Server 2000开发的,因此不会在1或2个地方使用NVARCHAR(MAX)来提供帮助。我已经更新了代码以使用NVARCHAR(MAX)而不是NVARCHAR(4000),因此使用了一个临时表,但没有使用这些更改更新文章。我将尽力做到这一天。我相信本文中的代码会查看一个数据库,而更新后的代码将查看所有可访问的DB(如果未指定)。

答案 1 :(得分:0)

您可以使用以下正则表达式来识别两种评论

(--.*?\n)|(/\*.*?\*/)

确保.也匹配换行符以识别多行注释

请注意,在某些系统上,\r被视为换行符,有些\r\n的组合是换行符。

答案 2 :(得分:0)

您可以使用我的ModuleStore项目的解析器组件,该组件从您传入的SQL创建语法树。然后可以以编程方式查询和修改此树。

http://code.google.com/p/bsn-modulestore/