在Stored Proc中,查找表名(可能带有正则表达式?),不包括两个模式

时间:2016-04-05 18:10:59

标签: sql-server regex ssms regex-negation

我的公司正在将所有报告生成表移动到另一台服务器,为此,我们需要找到存储过程访问实时表的所有实例,并删除这些访问,并通过访问快照来替换它们。我需要查看相当多的存储过程,我的眼睛开始流血试图滚动每个文件。我想也许正则表达式最好是查看每个存储过程。可能有更好的方法吗?

我希望找到所有存在FROM或JOIN的情况,然后是一个不以" Snapshot"或" EDI"开头的表。 (与报告相关的两个模式)。此外,我相信有人打字了#34; FROm"在事故中,所以不区分大小写会有所帮助。我也试图做\ s +因为有人可能在事故中输入了多个空格。

例如,希望排除:

  • FROM Snapshot
  • 来自EDI
  • 加入快照
  • 加入EDI

和不区分大小写的变体

我已经完成了教程here,但我仍然做得很短。到目前为止,我有:

[fFjJ] [RroO] [oOiI] [mMnN] \ S + ^(卡扣|!快| SNAP | EDI | EDI | EDI)$

有什么想法吗?

编辑:我使用查找和替换功能在SSMS 2016中使用正则表达式。

2 个答案:

答案 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');