您可以在TSQL中引用变量标识符和参数标识符吗?

时间:2019-04-24 15:03:23

标签: sql-server tsql

是否可以在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.

文档指出,变量标识符必须遵循与所有标识符相同的规则:

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/declare-local-variable-transact-sql?view=sql-server-2017

这是一个奇怪的请求,我们需要它工作的唯一原因是一个SQL Studio工具自动格式化错误错误地引用了变量名,这是客户端不想更改的名称!

1 个答案:

答案 0 :(得分:1)

任何引号均来自Database Identifiers

变量遵循“常规标识符”的规则。这些分类为:

  

常规标识符
  遵守标识符格式的规则。在Transact-SQL语句中使用常规标识符时,没有分隔符。

用引号引起来的对象(括在方括号([]中)不是常规标识符,而是定界标识符:

  

分隔标识符   用双引号(“)或方括号([])括起来。符合标识符格式规则的标识符可能不会被分隔。例如:

变量符合常规标识符规则的事实可以在“常规标识符规则”部分中找到:

  

变量,函数和存储过程的名称必须符合   具有以下Transact-SQL标识符规则。

     
      
  1. 第一个字符必须为以下字符之一:

         
        
    • Unicode标准3.2定义的字母。字母的Unicode定义包括从a到z的拉丁字符,从   A到Z,以及其他语言的字母字符。

    •   
    • 下划线(_),符号(@)或数字符号(#)。

           

      在标识符开头的某些符号在SQL Server中具有特殊含义。以at开头的常规标识符   符号始终表示局部变量或参数,不能使用   作为任何其他类型的对象的名称。开始的标识符   带有数字符号的符号表示临时表或过程。一个   以双数字符号(##)开头的标识符表示全局   临时对象。虽然数字符号或双数字符号   字符可用于开头其他类型的对象的名称,   我们不建议您这样做。

           

      某些Transact-SQL函数的名称以加号(@@)开头。为避免与这些功能混淆,您不应   使用以@@开头的名称。

    •   
  2.   

因此,由于变量的名称必须是常规标识符,所以分隔标识符[@ExampleVariable]无效。

奇怪的是,您可以制作一个带有定界标识符的SP /功能,从而推断出文档已过时。