是否可以在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.
文档指出,变量标识符必须遵循与所有标识符相同的规则:
这是一个奇怪的请求,我们需要它工作的唯一原因是一个SQL Studio工具自动格式化错误错误地引用了变量名,这是客户端不想更改的名称!
答案 0 :(得分:1)
任何引号均来自Database Identifiers
变量遵循“常规标识符”的规则。这些分类为:
常规标识符
遵守标识符格式的规则。在Transact-SQL语句中使用常规标识符时,没有分隔符。
用引号引起来的对象(括在方括号([]
中)不是常规标识符,而是定界标识符:
分隔标识符 用双引号(“)或方括号([])括起来。符合标识符格式规则的标识符可能不会被分隔。例如:
变量符合常规标识符规则的事实可以在“常规标识符规则”部分中找到:
变量,函数和存储过程的名称必须符合 具有以下Transact-SQL标识符规则。
第一个字符必须为以下字符之一:
Unicode标准3.2定义的字母。字母的Unicode定义包括从a到z的拉丁字符,从 A到Z,以及其他语言的字母字符。
下划线(_),符号(@)或数字符号(#)。
在标识符开头的某些符号在SQL Server中具有特殊含义。以at开头的常规标识符 符号始终表示局部变量或参数,不能使用 作为任何其他类型的对象的名称。开始的标识符 带有数字符号的符号表示临时表或过程。一个 以双数字符号(##)开头的标识符表示全局 临时对象。虽然数字符号或双数字符号 字符可用于开头其他类型的对象的名称, 我们不建议您这样做。
某些Transact-SQL函数的名称以加号(@@)开头。为避免与这些功能混淆,您不应 使用以@@开头的名称。
因此,由于变量的名称必须是常规标识符,所以分隔标识符[@ExampleVariable]
无效。
奇怪的是,您可以制作一个带有定界标识符的SP /功能,从而推断出文档已过时。