我试图在 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 '%[email protected] /cdn-cgi/l/email-protection%'
ORDER BY o.name
我有一个 CLR 库 (SQLSharp),可以在其中使用正则表达式,但我不确定可以识别注释与有效代码的正则表达式。
对于那些精通 RegEx 而不懂 SQL Server 的人来说,注释被定义为以两个破折号(例如 --)开头的单行或多行以 /* 开头并以 */ 结尾的多行
光是想到要弄清楚这个问题就让我的大脑受伤。
这可以使用我在 SQL Server Central 上的一篇文章中发布的代码来完成:
搜索对象中的文本 http://www.sqlservercentral.com/articles/Stored+Procedures/62975/
该文章中描述的存储过程不仅能够忽略内联 (--
)和块(/* ... */
) 注释,但它也可以忽略单引号内的文本。该代码将忽略注释的选项默认设置为 True,因为它似乎不太可能想要搜索无影响的文本。但忽略字符串的默认值是 False,因为动态 SQL 和其他一些可以进入字符串的文本最终可能仍然是有效的可执行代码。
该代码是为 SQL Server 2000 开发的,因此没有使用NVARCHAR(MAX)
在一两个真正有帮助的地方。我已经更新了代码以使用NVARCHAR(MAX)
代替NVARCHAR(4000)
因此只有一个临时表,但尚未用这些更改更新文章。有一天我会尝试这样做。我相信本文中的代码查看一个数据库,而更新的代码将查看所有可访问的数据库(如果未指定)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)