是否可以在TSQL中引用变量和参数标识符。这些文件似乎表明这是可能的。但是,在执行引号中的变量名时会引发错误。
-- This works fine, as one would expect
DECLARE @ExampleVariableGood bigint
-- Error - "can" variable names be quoted identifiers?
DECLARE [@ExampleVariableBad] bigint
在执行脚本时,会引发以下错误:
Msg 155, Level 15, State 2, Line 5
'bigint' is not a recognized CURSOR option.
文档声明,变量标识符必须遵循与所有标识符相同的规则:
这是一个奇怪的请求,我们需要这样做的唯一原因是Studio工具自动格式化错误不正确地引用变量名,这是客户不想更改的!
发布于 2019-04-24 07:07:18
任何引号都取自数据库标识符
变量遵循“常规标识符”的规则。这些分类如下:
正则标识符 遵守标识符格式的规则。常规标识符在Transact-SQL语句中使用时不进行分隔。
引用的对象(在方括号([]
)中使用)不是常规标识符,而是分隔标识符:
分隔标识符以双引号(")或方括号( )括起来。符合标识符格式规则的标识符可能不会被分隔。例如:
变量遵循正则标识符的规则这一事实可以在正则标识符规则一节中找到:
变量、函数和存储过程的名称必须符合Transact-SQL标识符的下列规则。
- A letter as defined by the Unicode Standard 3.2. The Unicode definition of letters includes Latin characters from a through z, from A through Z, and also letter characters from other languages.
- The underscore (\_), at sign (@), or number sign (#).
标识符开头的某些符号在Server中具有特殊意义。以at符号开头的常规标识符总是表示局部变量或参数,不能用作任何其他类型对象的名称。以数字符号开头的标识符表示临时表或过程。以双数字符号(##)开头的标识符表示全局临时对象。虽然数字符号或双数字符号字符可以用于开始其他类型的对象的名称,但我们不建议这样做。
有些Transact-SQL函数的名称以双引号开头(@@)。为了避免与这些函数混淆,您不应该使用以@@开头的名称。
因此,由于变量的名称必须是常规标识符,分隔的标识符[@ExampleVariable]
不是有效名称。
但是,奇怪的是,您可以创建一个带有分隔标识符的SP/函数,从而推断文档已经过时。
https://stackoverflow.com/questions/55833187
复制