与SQL对象(表/函数/视图)匹配的Regex模式

本文关键字:模式 Regex 函数 对象 SQL 视图 | 更新日期: 2023-09-27 18:29:45

问题:

给定一个类似的SQL字符串

CREATE VIEW TestView AS
SELECT value1, value2 
FROM TABLE_0
UNION
(SELECT * FROM TABLE_2) AS value1
,value2 
FROM TABLE_12 
UNION
SELECT * FROM TABLE_3

(小写)

像这样的字符串数组

string[] tables = new string[]{"table_1", "table_2", "table_3"}

现在我做到了:

if (strViewDefinition.Contains(strObjectName)) // aaaaargh

对于表中的每个strObjectName,检查视图是否依赖于此对象。

但这在table_12上失败(并导致循环依赖关系),例如,因为表包含"table_1"。Aaargh。

我需要一个正则表达式,它可以检查视图定义是否包含函数名、表值函数或其他视图。。。

(用于检查System.Text.RegularExpressions.Regex.IsMatch()

我的审判是:

string whateverneedsescaping= System.Text.RegularExpressions.Regex.Escape(@"+-*'/%=,'n'r");
string fieldsep = @"['s'n'r," + whateverneedsescaping+ "]*";
string strPattern = fieldsep + "VIEW/FUNCTION_NAME" + fieldsep;

但它失败了,而且它没有考虑到括号中包含的对象名称,比如

 "[TABLE_NAME]"

有人能帮忙吗?

与SQL对象(表/函数/视图)匹配的Regex模式

我认为它不起作用的原因是因为您的集合中有-字符。Regex.Escape不会转义此字符,因此您的字符集最终包含以下内容:

['s'n'r,'+-'*''/%=,''n''r]

该集合中的-试图在文字字符+*之间创建一个没有任何意义的范围,因此它抛出一个ArgumentException,并显示消息[x-y] range in reverse order

虽然我不能100%确定我是否理解你的确切要求,但我认为使用Qtax中单词边界的建议会奏效。

我想补充的是,您可以将[]包围的表名更改为:

'[?'btable_1'b]?

表达式'bname'b是否足够?CCD_ 9是一个单词边界。

例如,'btable_1'b将与table_12不匹配。

如果你有很多名字,你可以用'b(?:foo|bar|baz)'b这样的表达式来检查它们。

这就完成了任务:

string strSchema = "dbo";
string strRegexObjectName = System.Text.RegularExpressions.Regex.Escape(strObjectName);
string strPattern = @"['s'+'-'(,/%='*'']('[?" + strSchema + @"']?'.)?'[?" + strRegexObjectName + @"']?(['s'+'-'),/%='*'']|$)";