【问题标题】:Regex pattern that matches SQL object (table/function/view)?匹配 SQL 对象(表/函数/视图)的正则表达式模式?
【发布时间】:2012-04-03 08:48:12
【问题描述】:

问题:

给定一个类似的 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”。啊。

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

( 用于检查 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]"

有人可以帮忙吗?

【问题讨论】:

  • @Mark Ba​​nnister:是的,这是 SQL-Server。但是 SQL-Server 2005。另外,它也适用于其他 Db 系统,所以不要推荐我使用 SMO(SQL 2005 也有问题);-)

标签: c# .net sql regex vb.net


【解决方案1】:

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

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

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

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

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

\[?\btable_1\b]?

【讨论】:

    【解决方案2】:

    表达式\bname\b 就足够了吗? \bword boundary

    例如,\btable_1\btable_12 不匹配。

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

    【讨论】:

    • 它比那个复杂一点(单词边界),但感谢您提出的建议。
    【解决方案3】:

    这样就可以了:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多