验证.NET或正则表达式中的MSSQL标识符(参数)

Bar*_*jen 3 .net regex t-sql sql-server

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

例: SELECT * FROM table WHERE column = @parameter

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

从标识符文档中,参数应符合以下通用标识符规则:

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

在Transact-SQL语句中使用标识符时,不符合这些规则的标识符必须用双引号或括号分隔.

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

Bar*_*jen 6

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

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

这强制执行:

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