使用两个(或更多)“@”符号声明SQL Server变量会产生什么后果?

时间:2011-01-27 14:03:23

标签: sql sql-server tsql variables

通常,我会声明一个变量

declare @ConType int;

或类似的东西。

最近在代码审查中,我遇到了使用双“@”的decalration(例如内置的@@ rowcount),即

declare @@ConType int;

我注意到任何(合理)数量的'@'都可能会产生错误:

declare @@@@ConType int;

变量应该运行正常。因此,以下内容应该有效:

declare @@@@ConType int;
set @@@@ConType = 1;
select @@@@ConType;

很明显,上面的内容有点愚蠢,但我的问题是,以这种方式声明变量是否有任何意义?有没有什么副作用?我们应该避免这样做吗?

4 个答案:

答案 0 :(得分:15)

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

但是,你应该避免声明以符号加号开头的变量('@@'),因为用MSDN的话说:

  

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

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

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

答案 1 :(得分:3)

来自MSDN

  

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

[编辑]为了澄清,SQL Server将允许您在变量名称的前面放置许多符号,但技术上@@对象根本不是变量。尽管它们看起来像系统功能,但它们的行为却像那样。有些人试图使用@@来指定一个全局变量,但这不起作用;您无法创建全局变量。这种行为通常只是使用早期版本的SQL Server而遗留下来。

答案 2 :(得分:3)

就我而言,只要你没有与系统功能发生冲突就没有任何过分的错误,只是因为@@是一个有效的变量名并不意味着你应该使用它。

如果您声明变量@var@@var@@@var,那么很可能您的变量命名错误,并且会对那些将来必须维护变量的人造成混淆。< / p>

编辑 -

有关您可以滥用sql同时保持有效性的主题的进一步阅读,请参阅Phil Factor的这篇精彩帖子 - Evil Code

答案 3 :(得分:2)

看起来很愚蠢,微软建议在rules for identifiers中反对它,(“有些Transact-SQL函数的名称以符号开头为双(@@)。为了避免与这些函数混淆,你不应该使用以@@。“开头的名称,但除此之外,您提供的示例符合相同的规则且完全有效。

使用此表单的变量应该没有任何损害,尽管可能没有正当理由这样做。