C# 与SQL对象(表/函数/视图)匹配的正则表达式模式?
问题: 给定一个SQL字符串,如C# 与SQL对象(表/函数/视图)匹配的正则表达式模式?,c#,.net,sql,regex,vb.net,C#,.net,Sql,Regex,Vb.net,问题: 给定一个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"} 现
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,检查视图是否依赖于此对象
但这在表_12上失败(并导致循环依赖),例如,因为表包含“表_1”。啊
我需要一个正则表达式,可以检查视图定义是否包含函数名、表值函数或其他视图
(
核对
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]"
任何人都可以帮忙吗?表达式
\bname\b
就足够了吗?\b
是一个
例如,\b表1\b
与表12
不匹配
如果你有很多名字,你可以用一个类似
\b(?:foo | bar | baz)\b
的表达式来检查它们。我认为它不起作用的原因是因为你的字符集中有-
字符。这个字符不是由正则表达式转义的,因此你的字符集最终包含以下内容:
[\s\n\r,\+-\*\\/%=,\\n\\r]
此集合中的-
尝试在文本字符+
和*
之间创建一个范围,该范围没有任何意义,因此它以相反的顺序抛出带有消息[x-y]范围的ArgumentException
虽然我不能100%确定我是否理解您的确切要求,但我认为使用Qtax中的单词边界的建议是可行的
我想补充的是,您可以通过将表名更改为:
\[?\btable_1\b]?
这就是工作:
string strSchema = "dbo";
string strRegexObjectName = System.Text.RegularExpressions.Regex.Escape(strObjectName);
string strPattern = @"[\s\+\-\(,/%=\*\\](\[?" + strSchema + @"\]?\.)?\[?" + strRegexObjectName + @"\]?([\s\+\-\),/%=\*\\]|$)";
@马克·班尼斯特:是的,这是SQL Server。但是SQL Server 2005。另外,它也适用于其他数据库系统,所以不要推荐我使用SMO(顺便说一句,SQL 2005上的buggy);-)它比这个(单词边界)要复杂一点,但是谢谢你的建议,可以一次完成所有的工作。