【问题标题】:Regular expression for validating SQL Server table name用于验证 SQL Server 表名的正则表达式
【发布时间】:2015-05-10 13:08:42
【问题描述】:

我正在使用 C# 代码创建动态 SQL Server 表,但我需要验证表名。

什么是验证 SQL Server 表名的正则表达式?

【问题讨论】:

  • \w 有什么问题?即[a-zA-Z0-9_]??
  • 关于这个正则表达式 regex = new Regex(@"^[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz[]. -_0123456789]{1,128}$"); if (!regex.IsMatch(tableName)) throw new ApplicationException("Invalid table name");

标签: regex sql-server-2008 c#-4.0


【解决方案1】:

link 中描述的正则表达式应该是:

var regex = new Regex(@"^[\p{L}_][\p{L}\p{N}@$#_]{0,127}$");

请注意,由于规则 3,通常您必须在 [...] 中嵌入表的名称(因此 SELECT * FROM [SET] 是有效查询,因为虽然 SET 是保留关键字,但您可以用[...]“逃脱”它)

请注意,链接页面中的规则不完整:

来自https://msdn.microsoft.com/en-us/library/ms175874.aspx

  1. 标识符不能是 Transact-SQL 保留字。 SQL Server 保留保留字的大写和小写版本。在 Transact-SQL 语句中使用标识符时,不符合这些规则的标识符必须用双引号或括号分隔。保留的字取决于数据库兼容级别。可以使用 ALTER DATABASE 语句设置此级别。

他们忘记了:https://msdn.microsoft.com/en-us/library/ms174979.aspx

是新表的名称。表名必须遵循标识符规则。 table_name 最多可包含 128 个字符,但不能超过 116 个字符的本地临时表名称(以单个数字符号 (#) 为前缀的名称)除外。

我编写的规则是针对“完整”表,而不是针对临时表,并且不包括架构名称。

【讨论】:

  • 即使不推荐首​​字符也可以是@或者#
  • @CasimiretHippolyte 但至少在我这里的 SQLFiddle 和 SQL Express LocalDB 上(抱歉,我的机器上没有完整的 SQL Server),似乎 [@Foo][Foo Bar] 都是有效的表名......所以看起来MSDN上给出的规则是“de minimis”规则,其他名称是有效的。
  • @CasimiretHippolyte 我的问题是表格的名称似乎更像是“任何事情都可以”......sqlfiddle.com/#!6/af4ca/2我能够命名一个表格° § ^ ? * - %
  • 难以置信,它也适用于海狸桌:[(8B °)<##)]
  • @ShimmyWeitzhandler 包括_ ([\p{L}_]),而@# 将使表成为表变量/临时表,但正如我所说在响应中我编写的规则是针对“完整”表,而不是针对临时表,并且不包括架构名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
相关资源
最近更新 更多