Sql 使用两个(或多个)'@';符号?

Sql 使用两个(或多个)'@';符号?,sql,sql-server,tsql,variables,Sql,Sql Server,Tsql,Variables,通常,我会声明一个变量 declare @ConType int; 或者类似的东西 最近在一次代码复查中,我遇到了一个使用双'@'的贴花(例如内置的@rowcount),即 我注意到一个人可以使任何(合理的)数量的@感到惊讶: declare @@@@ConType int; 变量应该可以正常工作。因此,以下措施应该有效: declare @@@@ConType int; set @@@@ConType = 1; select @@@@ConType; 显然,上面的说法有点愚蠢,但我的问题

通常,我会声明一个变量

declare @ConType int;
或者类似的东西

最近在一次代码复查中,我遇到了一个使用双'@'的贴花(例如内置的@rowcount),即

我注意到一个人可以使任何(合理的)数量的@感到惊讶:

declare @@@@ConType int;
变量应该可以正常工作。因此,以下措施应该有效:

declare @@@@ConType int;
set @@@@ConType = 1;
select @@@@ConType;
显然,上面的说法有点愚蠢,但我的问题是,用这种方式声明变量是否真的有意义?有副作用吗?我们应该避免这样做吗?

来自:

某些Transact-SQL系统函数的名称以两个at符号(@)开头。尽管在早期版本的Microsoft SQL Server中,@@函数被称为全局变量,但它们不是变量,并且与变量的行为不同。@@函数是系统函数,它们的语法用法遵循函数的规则


[编辑]为了澄清这一点,SQL Server将允许您在变量名前面添加任意数量的at符号,但从技术上讲@对象根本不是变量。尽管它们看起来像系统函数,但它们的行为却像这样。有些人试图使用@来指定一个全局变量,但这不起作用;您无法创建全局变量。这种行为通常是使用早期版本的SQL Server时遗留下来的。

这看起来很愚蠢,Microsoft建议您在中使用这种行为(“某些Transact-SQL函数的名称以双at符号(@@)开头。为避免与这些函数混淆,您不应使用以@@@开头的名称”),但除此之外,你给出的例子也符合同样的规则,完全有效


使用这种形式的变量应该没有什么害处,尽管这样做可能也没有正当的理由。

变量名的第一个字符必须是at符号(“@”)。之后的任何at符号都没有任何特殊意义,并且被视为与任何其他字符一样

但是,您应该避免声明以双精度at符号('@')开头的变量,因为,用下面的话来说:

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

当然,这意味着也不应该使用以三个或更多at符号开头的变量名


如果第二个字符不是at符号,我想在变量名后面使用at符号并不完全是错误的,但它看起来很混乱,所以这可能也不是一个好主意。

就我而言,只要不与系统函数发生冲突,就没有什么大问题,然而,仅仅因为
@
是一个有效的变量名并不意味着您应该使用它

如果您声明的变量
@var
@@var
@@@var
,那么您的变量的名称可能不正确,这将给将来必须维护它的人带来混乱

编辑-


要进一步了解如何在保持sql有效性的同时滥用sql,请参阅Phil Factor的这篇精彩文章-

因此,即使我可以执行
set@@ConType=1
,变量
@@ConType
实际上是一个系统函数?听起来不太对。还有,
@@@ConType
@@@ConType
等等呢?@James:
@@@ConType
不是一个系统函数(并不是因为它有一个双at符号就神奇地变成了一个),但它看起来好像是一个,这很让人困惑。我的错-我编辑了答案说@ConType看起来像一个系统函数,即使不是@@当然,系统功能指的是实际的系统功能。您可以在变量名前面粘贴任意多个@符号,这对SQL Server没有影响。通常,当您看到两个at标志时,这是旧的、过时的SQL Server行为的残余。只要遇到一个MS函数,它使用
@
来表示
输出
变量,很高兴看到它们遵循了。这个建议有变吗?我在文档中提供的一个示例中发现该约定被打破
declare @@@@ConType int;
set @@@@ConType = 1;
select @@@@ConType;