我的公司正在将所有报告生成表移动到另一台服务器,为此,我们需要找到存储过程访问实时表的所有实例,并删除这些访问,并通过访问快照来替换它们。我需要查看相当多的存储过程,我的眼睛开始流血试图滚动每个文件。我想也许正则表达式最好是查看每个存储过程。可能有更好的方法吗?
我希望找到所有存在FROM或JOIN的情况,然后是一个不以" Snapshot"或" EDI"开头的表。 (与报告相关的两个模式)。此外,我相信有人打字了#34; FROm"在事故中,所以不区分大小写会有所帮助。我也试图做\ s +因为有人可能在事故中输入了多个空格。
例如,希望排除:
和不区分大小写的变体
我已经完成了教程here,但我仍然做得很短。到目前为止,我有:
[fFjJ] [RroO] [oOiI] [mMnN] \ S + ^(卡扣|!快| SNAP | EDI | EDI | EDI)$
有什么想法吗?
编辑:我使用查找和替换功能在SSMS 2016中使用正则表达式。
答案 0 :(得分:1)
虽然我没有在我面前举办SSMS 2016,但docs似乎暗示这会有效。
(FROM|JOIN)\s+~((Snapshot|Edi)\.):a*>
击穿
(FROM|JOIN) --Match the word from or join
\s+ --match at least one bit of whitespace
~( --don't call it a match if this comes next
(Snapshot|Edi)\. --the word Snapshot or Edi followed by a period
) --end of the don't match prefix
:a* --match any number of alphanumeric characters (this is your table name, so you may need a different character class depending on what characters you use in your tables)
> --match the end of a word
“查找和替换”对话框中还应该有一个选项可以进行不区分大小写的匹配。
答案 1 :(得分:0)
事实证明使用T-SQL找到Here on MSDN的方法要好得多。我仍然必须通过SP去SP,但它比使用正则表达式并忘记一些边界要快得多且不易出错。
SELECT OBJECT_NAME(referencing_id) AS referencing_entity_name,
o.type_desc AS referencing_desciption,
COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS referencing_minor_id,
referencing_class_desc,
referenced_server_name, referenced_database_name, referenced_schema_name,
referenced_entity_name,
COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS referenced_column_name,
is_caller_dependent, is_ambiguous
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id
WHERE referencing_id = OBJECT_ID(N'EDI.Populate_IHP_OHN_Eligibility_Report')
AND referenced_schema_name NOT IN ('EDI', 'Snapshot');