6

我正在尝试在 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 的人,注释被定义为以两个破折号(例如 --)开头的单行或以 /* 开头并以 */ 结尾的多行

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

4

3 回答 3

2

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

在对象中搜索文本

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

该代码是为 SQL Server 2000 开发的,因此不会NVARCHAR(MAX)在 1 或 2 个真正有帮助的地方使用。此后,我更新了要使用的代码,NVARCHAR(MAX)而不是NVARCHAR(4000)单个临时表,但没有用这些更改更新文章。我会尝试在这些日子里做到这一点。而且我相信本文中的代码会查看一个数据库,而更新后的代码将查看所有可访问的数据库(如果未指定)。

于 2013-06-10T23:16:36.733 回答
0

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

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

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

请注意,在某些系统上,\r它被视为换行符,而在某些系统上,它被视为换行符\r\n

于 2012-08-13T06:21:54.563 回答
0

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

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

于 2012-08-13T06:39:42.983 回答