通常,我会声明一个变量
declare @ConType int;
或类似的东西。
最近在代码审查中,我遇到了使用双“@”的decalration(例如内置的@@ rowcount),即
declare @@ConType int;
我注意到任何(合理)数量的'@'都可能会产生错误:
declare @@@@ConType int;
变量应该运行正常。因此,以下内容应该有效:
declare @@@@ConType int;
set @@@@ConType = 1;
select @@@@ConType;
很明显,上面的内容有点愚蠢,但我的问题是,以这种方式声明变量是否有任何意义?有没有什么副作用?我们应该避免这样做吗?
答案 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函数的名称以符号开头为双(@@)。为了避免与这些函数混淆,你不应该使用以@@。“开头的名称,但除此之外,您提供的示例符合相同的规则且完全有效。
使用此表单的变量应该没有任何损害,尽管可能没有正当理由这样做。