![](/img/trans.png)
[英]What are the consequences of converting heap-indexes to clustered indexes on SQL Server?
[英]What are the consequences of declaring a SQL Server Variable with two (or more) '@' symbols?
通常,我会声明一个变量
declare @ConType int;
或类似于此的东西。
最近在代码审查中,我遇到了使用双'@'的decalration(例如内置的@@ rowcount),即
declare @@ConType int;
我注意到一个人可以把任何(合理)数量的'@'搞砸:
declare @@@@ConType int;
变量应该运行正常。 所以,以下应该工作:
declare @@@@ConType int;
set @@@@ConType = 1;
select @@@@ConType;
很明显,上面的内容有点愚蠢,但我的问题是,以这种方式声明变量是否有任何意义? 有没有什么副作用? 我们应该避免这样做吗?
变量名的第一个字符必须是at符号('@')。 之后的任何标志都没有任何特别的意义,并且被视为与任何其他角色一样。
但是 ,你应该避免声明以符号('@@')开头的变量,因为用MSDN的话来说:
某些Transact-SQL函数的名称以符号(@@)的double开头。 为避免与这些功能混淆,不应使用以@@开头的名称。
当然,这意味着也不应使用以符号中的三个或更多开头的变量名称。
如果第二个字符不是at符号,我想在变量名后面的符号中使用它并不完全错误,但它看起来很混乱,所以它可能也不是一个好主意。
来自MSDN :
一些Transact-SQL系统函数的名称以两个符号(@@)开头。 虽然在早期版本的Microsoft SQL Server中,@@函数称为全局变量,但它们不是变量,并且与变量的行为不同。 @@函数是系统函数,它们的语法用法遵循函数规则。
[编辑]为了澄清,SQL Server将允许您在变量名称的前面放置许多符号,但技术上@@对象根本不是变量。 尽管它们看起来像系统功能,但它们的行为却像那样。 有些人试图使用@@来指定一个全局变量,但这不起作用; 您无法创建全局变量。 这种行为通常只是使用早期版本的SQL Server而遗留下来的。
就我而言,只要你没有与系统功能发生碰撞就没有任何问题,只是因为@@
是一个有效的变量名并不意味着你应该使用它。
如果您声明变量@var
, @@var
和@@@var
那么很可能您的变量命名错误,并且会对那些将来必须维护变量的人造成混淆。
编辑 -
为了进一步阅读有关您可以滥用sql同时保持有效性的主题,请参阅Phil Factor的这篇精彩文章 - 邪恶代码
它看起来很愚蠢,微软建议在标识符规则中反对它(“有些Transact-SQL函数的名称以符号(@@)开头的双重开头。为了避免与这些函数混淆,你不应该使用以@@。“),但除此之外,您提供的示例符合相同的规则且完全有效。
使用这种形式的变量应该没有坏处,尽管可能没有合法的理由这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.