问题:
给定一个 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,检查 View 是否依赖于此对象。
但这在 table_12 上失败(并导致循环依赖),例如,因为表包含“table_1”。啊啊啊。
我需要一个正则表达式来检查 View 定义是否包含函数名称、表值函数或另一个 View ...
( 用于检查 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]
此集合中的 -
试图在文字字符 +
和 *
之间创建一个范围,这没有任何意义,因此它会抛出一个带有消息 [x-y] range in reverse order
的 ArgumentException。
虽然我不能 100% 确定我理解您的确切要求,但我认为关于使用 Qtax 中的单词边界的建议会奏效。
我要补充的是,您可以将 []
包围的表名更改为:
\[?\btable_1\b]?
关于c# - 匹配 SQL 对象(表/函数/ View )的正则表达式模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9989943/