【问题标题】:Validate MSSQL identifier (parameter) in .NET or regular expression在 .NET 或正则表达式中验证 MSSQL 标识符(参数)
【发布时间】:2009-04-22 03:25:20
【问题描述】:

在 .NET 项目中,我需要验证字符串是否是有效的 Microsoft SQL Server 2005 参数标识符。

例子: SELECT * FROM table WHERE column = @parameter

是否有运行时类方法来验证字符串是否为参数,或者是否有正则表达式来验证规则?(见下文)

From the documentation on identifiers,参数应符合这些通用标识符规则:

  1. 第一个字符必须是以下之一: * 定义的字母 通过 Unicode 标准 3.2。这 字母的Unicode定义包括 从 a 到 z 的拉丁字符, 从 A 到 Z,还有字母 来自其他语言的字符。 * 下划线 (_)、at 符号 (@) 或 数字符号 (#)。
    某些符号 在标识符的开头有 SQL Server 中的特殊含义。一种 以 at 符号始终表示本地 变量或参数,不能是 用作任何其他类型的名称 目的。开头的标识符 数字符号表示临时 表或程序。一个标识符 以双数字符号 (##) 开头 表示全局临时对象。 虽然数字符号或双 数字符号字符可用于 开始其他类型的名称 对象,我们不建议这样做 实践。一些 Transact-SQL 函数 名称以 double at 开头 标志 (@@)。为了避免混淆 这些功能,你不应该使用 以@@ 开头的名称。
  2. 后续字符可以包括以下内容: * 定义的字母 在 Unicode 标准 3.2 中。 * 来自 Basic 的十进制数 拉丁文或其他国家文字。 * at 符号、美元符号 ($)、数字 符号或下划线。
  3. 标识符不能是 Transact-SQL 保留字。 SQL 服务器 保留大写和 保留字的小写版本。
  4. 不允许嵌入空格或特殊字符。
  5. 不允许使用补充字符。

当标识符用于 Transact-SQL 语句, 不符合的标识符 这些规则必须由 双引号或括号。

由于我只想验证参数,因此标识符必须以 @ 符号开头,并且不能被分隔。

【问题讨论】:

  • 您是在尝试从某个应用程序解析 SQL,还是想在之后运行 SQL 语句?

标签: .net sql-server regex tsql


【解决方案1】:

我偶然发现了 Unicode 字符类,但是一旦我发现 .NET 正则表达式支持它们,我想出了以下正则表达式来解决我的问题:

@[\p{L}{\p{Nd}}$#_][\p{L}{\p{Nd}}@$#_]*

这强制执行:

  • 标识符始终以@开头,使其成为参数。
  • 不允许在第二个位置使用 @ 以避免与特殊 TSQL 函数混淆。
  • 只允许规则中定义的字符。

【讨论】:

  • +1,但我想指出 @@identifiers 不受此正则表达式支持。 @BartVerkoeijen 指出了他的推理,但应该清楚的是,即使它们可能对特殊的 TSQL 函数感到困惑,但它们实际上是有效的标识符。完全符合规范的正则表达式是@[\p{L}\p{Nd}@$#_]+
  • @LunicLynx 这将允许多个@s 在标识符的任何位置。如果这是故意的,那就完美了:-)如果您只想在开头允许一个或两个@ 符号,那么考虑使用@@? 开始正则表达式,而不是在字符类中包含@。
【解决方案2】:

我发现这篇文章是关于在 TSQL 上创建一个用于评估正则表达式的函数,内部使用 VBScript,请查看here

另一个你会发现有用的链接,但我认为它需要注册,here

另一个想法可以将@parameter 处理为系统名称数据类型,不知道它是否适合这里

【讨论】:

  • 感谢您的输入,但我想检查客户端(在本例中为 ASP.NET)而不是服务器端的规则。如果我不清楚这部分,我很抱歉。
猜你喜欢
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2013-08-04
  • 2016-03-08
  • 2019-08-03
  • 1970-01-01
相关资源
最近更新 更多