Объявления переменной T-SQL [дубликат]

decimal val = 0.000000000100m;
string result = val == 0 ? "0" : val.ToString().TrimEnd('0').TrimEnd('.');
16
задан AspOnMyNet 1 June 2010 в 20:14
поделиться

2 ответа

SQL Server не имеет видимости переменных уровня блока.

Это за пакетный / сохраненный proc и т. д.

Из MSDN (мой полужирный)

Объем переменной - это диапазон операторов Transact-SQL, которые могут ссылаться на переменную. Объем переменной длится от той точки, которая объявляется до конца партии или хранимой процедуры, в которой она объявлена.

16
ответ дан gbn 21 August 2018 в 12:37
поделиться
  • 1
    Имеет смысл, но разве это не недостаток, поскольку, возможно, бывают ситуации, когда мы хотим создать переменную только при выполнении определенных условий? – AspOnMyNet 1 June 2010 в 20:34
  • 2
    На самом деле, нет. SQL не компилируется или не скопирован, как c #, скажем, потому что он декларативный. Являясь разработчиком DBA, я мог бы сказать, что c # и Java ошибочны из-за своих правил определения области видимости, причем переменные объявлены во внешних и внутренних блоках. Я имею в виду, имея 2 @ A vars? Да ладно... – gbn 1 June 2010 в 20:41
  • 3
    Спасибо за помощь – AspOnMyNet 1 June 2010 в 21:21

gbn ответил на вопрос, но в соответствующей заметке обратите внимание на такой код:

DECLARE @i INT = 0
WHILE @i < 2
BEGIN
    DECLARE @a VARCHAR(100)

    IF @i = 0
        SET @a = 'changed'

    PRINT COALESCE(@a, 'is null')   
    SET @i = @i + 1
END

При запуске он дважды печатает «изменено», в то время как многие люди, вероятно, ожидают его печати «изменено», затем «равно null». Будьте осторожны при объявлении переменных внутри циклов. Возможно, вы захотите явно указать значение NULL в объявлении. например,

DECLARE @a VARCHAR(100) = NULL

Когда эта модифицированная версия запущена, она отображает «изменено», затем «равно null».

4
ответ дан Moe Sisko 21 August 2018 в 12:37
поделиться
  • 1
    Хороший совет. Возможно, я пропустил это. Thanx – AspOnMyNet 2 June 2010 в 19:46
Другие вопросы по тегам:

Похожие вопросы: