与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]"
有人能帮忙吗?
我认为它不起作用的原因是因为您的集合中有-
字符。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'+'-'),/%='*'']|$)";