用于在 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 存储过程中查找表名的列名作为保留关键字