用于在 SQL Server 中验证表名的正则表达式(数据库兼容级别 120)[关闭]

Posted

技术标签:

【中文标题】用于在 SQL Server 中验证表名的正则表达式(数据库兼容级别 120)[关闭]【英文标题】:Regex for validating table name in SQL Server (database compatibility level 120) [closed] 【发布时间】:2015-08-22 15:45:27 【问题描述】:

我正在尝试使用 this Stack Overflow answer 验证表/列名称,但它不起作用。

对于ValidateTableName("18_18_mapped"),它返回false。但是对于ValidateTableName("mappingStorage_f9dc07dbca414e2d86db00114a9104a3") - 它返回true

任何有关验证表/列名称的输入都会有所帮助。

static void Main(string[] args)

    bool temp = ValidateTableName("18_18_mapped"); // Returns false
    ...


private static bool ValidateTableName(string tableName)

    string regexForTableName = @"^[\pL_][\pL\pN@$#_]0,127$";
    return Regex.IsMatch("[" + tableName + "]", regexForTableName);
   

【问题讨论】:

你可以定义“不工作”吗? 对于 ValidateTableName("18_18_mapped"),它返回 false。但是对于 ValidateTableName("mappingStorage_f9dc07dbca414e2d86db00114a9104a3");返回真 您是否尝试过使用不同的模式,例如:\d+_\d+_mapped 您没有正确使用***.com/questions/30151800/… 中的答案。您添加方括号。 【参考方案1】:

不要加方括号:

return Regex.IsMatch(tableName, regexForTableName);

模式中的括号是表示字符类所必需的。这些不是文字方括号。

另外,为了提高效率,我会在方法之外声明/编译正则表达式:

private static readonly Regex regexForTableName = new Regex(@"^[\pL_][\pL\pN@$#_]0,127$");

private static bool ValidateTableName(string tableName)

    return regexForTableName.IsMatch(tableName);
   

编辑

根据 MSDN,这些是 specifications for database identifiers。我找不到任何说明第一个字符可以是数字的规范。但是,如果您需要允许,请添加 \pN 模式:

^(?:[\pN\pL_][\pL\pN@$#_]0,127|\[.1,126\])$

我正在添加\[.1,126\] 以支持所有包含在[] 中的名称,并且它们的长度必须为128 个字符。正则表达式仅匹配非临时表名。

【讨论】:

对于 ValidateTableName("18_18_mapped"),即使我删除括号,它也会返回 false。但是对于 ValidateTableName("mappingStorage_f9dc07dbca414e2d86db00114a9104a3");返回真 18_18_mapped 以数字开头,不符合正则表达式模式。为什么你认为它是真的? 但是 18_18_mapped 是一个有效的 sql 表名。 所以,您似乎将数据库兼容性级别设置为 100 以外的值。你的情况是什么? 数据库兼容级别为120

以上是关于用于在 SQL Server 中验证表名的正则表达式(数据库兼容级别 120)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 存储过程中查找表名的列名作为保留关键字

用于从多个表中查找具有表名的所有记录的 SQL 查询

用于检查有效变量名的正则表达式

如何安全地创建一个查询,该查询将列出给定表名的列名,以及可能指向 SQL Server 或 MySQL 的连接字符串?

BigQuery 存储过程,用于捕获表名以及该表名的记录数

SQL 电子邮件验证(无正则表达式)