c# - 匹配 SQL 对象(表/函数/ View )的正则表达式模式?

标签 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"}

现在我做到了:

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/

相关文章:

mysql在表中选择唯一用户并根据列对其进行多次计数

javascript - 如何在带星号(密码字段)的文本框字段中显示最后 3 个字符?

c# - Array.Empty<int>() : Why does Rider show an allocation occurred, 但 BenchmarkDotNet 没有?

asp.net - 有条件的 ASP.NET 中继器

javascript - OData Uri 批量返回 404,而如果我转到提供的 url,它就可以工作。为什么?

php - 将数据保存到Yii中具有两个模型的两个数据库表

php - 在 MySQL 中通过单个查询获取今天、本周、本月和今年的数据?

C# Google 分析事件类别为空

c# - 将字节数组初始化为某个值,而不是默认的 null?

c# - sqlite数据库位置uwp