Sql server 您能在TSQL中引用变量标识符和参数标识符吗?

Sql server 您能在TSQL中引用变量标识符和参数标识符吗?,sql-server,tsql,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, Leve

是否可以在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工具自动格式化错误错误地引用了变量名,这是客户端不想更改的

任何引用都取自

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

常规标识符
遵守标识符格式的规则。在Transact-SQL语句中使用常规标识符时,它们不会被分隔

引用的对象(用括号括起来(
[]
)不是常规标识符,而是分隔标识符:

分隔标识符 包含在双引号(“)或括号([])中。符合标识符格式规则的标识符可能不会被分隔。例如:

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

变量、函数和存储过程的名称必须符合 使用以下Transact-SQL标识符规则

  • 第一个字符必须是以下字符之一:

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

    • 下划线(35;)、at符号(@)或数字符号(#)

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

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

  • 因此,由于变量的名称必须是常规标识符,分隔的标识符
    [@ExampleVariable]
    不是有效的名称


    尽管奇怪的是,您可以创建一个带有分隔标识符的SP/函数,这意味着文档已过时。

    我不理解这里的问题。显然,您发布的语法无效。不知道您为什么要这样做。这是合法的,但它并不能满足您的要求——在上面的语句中,
    [@examplevaluate]
    必须被解释为游标名称,因为
    @
    没有被解析为参数/变量的符号。这仅在您实际需要引用名称中包含
    @
    的参数和变量以外的内容时才有用。因此,如果您实际有参数/变量,这将不起作用,您必须使用一个实际了解T-SQL的非破坏性工具。不要用太多的词来说明这一点——他们说“以at符号开头的常规标识符总是表示局部变量或参数,不能用作任何其他类型对象的名称,但它们没有明确说明分隔标识符不能引用变量或参数。然而,情况就是这样--
    从[@a]
    中选择*,使用
    @a
    表格变量或参数无效<代码>从[#a]中选择*和
    一个临时表是不正确的。
    从[@a]
    中选择*指的是一个常规表。名为
    @a
    -不是名为
    @a
    的表变量,我认为文档之所以混乱,是因为它们混淆了某事物的实际名称和我们引用它的方式(或者至少它们没有足够清楚地区分)。也就是说,名为
    #a
    的表可以合法地称为
    #a
    [#a]
    ,其中一个是常规标识符,另一个是分隔标识符,但是名为
    @a
    的变量不能合法地称为
    [@a]
    [@a]
    是一个有效的标识符(
    创建表[@a]
    很好!),但它只能引用对象,不能引用变量。如果文档是明确的,我们会为
    #a
    推断出相同的规则,但事实并非如此。Jeroen非常感谢您的帮助。我读了同样的“误导性”文件。带有@的示例用于分隔标识符,我认为变量不是。