繁体   English   中英

使用两个(或更多)“@”符号声明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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM