Каковы последствия объявления переменной SQL Server с двумя (или более) символами «@»? - PullRequest
9 голосов
/ 27 января 2011

Обычно я объявляю переменную

declare @ConType int;

Или что-то похожее на это.

Недавно в обзоре кода я обнаружил декалирование с использованием двойного '@' (например, встроенного @@ rowcount), то есть

declare @@ConType int;

Я заметил, что можно ввести любое (разумное) число '@':

declare @@@@ConType int;

И переменная должна функционировать нормально. Итак, должно работать следующее:

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

Очевидно, вышесказанное немного глупо, но мой вопрос действительно заключается в том, имеет ли какое-либо значение объявление переменных таким образом? Есть ли побочные эффекты? Должны ли мы этого избегать?

Ответы [ 4 ]

15 голосов
/ 27 января 2011

Первый символ имени переменной должен быть знаком at ('@'). Любые знаки после этого не имеют особого значения и трактуются так же, как и любой другой символ.

Однако следует избегать объявления переменных, начинающихся с двойного знака ('@@'), потому что, по словам MSDN :

Некоторые функции Transact-SQL имеют имена, начинающиеся с двойного знака (@@). Во избежание путаницы с этими функциями не следует использовать имена, начинающиеся с @@.

Конечно, это означает, что имена переменных, начинающиеся с трех или более знаков, также не должны использоваться.

Я полагаю, что не совсем неправильно использовать знаки позже в имени переменной, если второй символ не является знаком at, но выглядит просто сбивающим с толку, поэтому, вероятно, это тоже не очень хорошая идея.

3 голосов
/ 27 января 2011

Насколько я понимаю, в этом нет ничего чрезмерного, если вы не сталкиваетесь с системной функцией, однако то, что @@ является допустимым именем переменной, не означает, что вы должны его использовать.

Скорее всего, если ваши объявленные переменные @var, @@var и @@@var, тогда ваши переменные имеют неправильные имена, и это вызовет путаницу у тех, кто должен поддерживать их в будущем.

Редактировать -

Дополнительную информацию о том, насколько сильно вы можете злоупотреблять sql, сохраняя при этом действительность, смотрите в этом замечательном сообщении Фила Фактора - Злой код

3 голосов
/ 27 января 2011

С MSDN :

Имена некоторых системных функций Transact-SQL начинаются с двух в знаках (@@). Хотя в более ранних версиях Microsoft SQL Server функции @@ назывались глобальными переменными, они не являются переменными и не ведут себя так же, как переменные. Функции @@ являются системными функциями, и их использование синтаксиса соответствует правилам для функций.

[РЕДАКТИРОВАТЬ] Для пояснения, SQL Server позволит вам поместить столько знаков, сколько вы хотите, в начале имен ваших переменных, но технически @@ объекты вообще не являются переменными. Они ведут себя так, хотя выглядят как системные функции. Некоторые люди пытаются использовать @@ для обозначения глобальной переменной, но это не работает; у вас нет возможности создать глобальную переменную. Такое поведение обычно остается в стороне от использования более ранних версий SQL Server.

2 голосов
/ 27 января 2011

Это выглядит глупо, и Microsoft рекомендует против этого в правилах для идентификаторов , («Некоторые функции Transact-SQL имеют имена, начинающиеся с двойных знаков (@@). Чтобы избежать путаницы с этими функциями, вы не должны использовать имена, начинающиеся с @@. "), но в противном случае приведенные вами примеры соответствуют тем же правилам и совершенно действительны.

Не должно быть никакого вреда при использовании переменных этой формы, хотя, вероятно, также нет законных оснований для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...