Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
Kull Damned
Member [заблокирован]

Откуда: Князь Мышкин
Сообщений: 34357
select @@version

if 1=0
  declare @tmp varchar(100)
set @tmp='Preved!'
select @tmp
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
Jul 9 2008 14:43:34
Copyright (c) 1988-2008 Microsoft Corporation
Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)


(1 row(s) affected)


----------------------------------------------------------------------------------------------------
Preved!

(1 row(s) affected)

Будущего нет. И завтра не будет. ©
4 июн 09, 11:32    [7264116]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
soljo_ua
Member

Откуда: Киев
Сообщений: 369
и что Вас смущает все правильно отработало,а вот если так
SELECT  @@version

IF 1 = 0 
    BEGIN
        DECLARE @tmp VARCHAR(100)
        SET @tmp = 'Preved!'
        SELECT  @tmp
    END 
4 июн 09, 11:35    [7264136]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
Kull Damned
Member [заблокирован]

Откуда: Князь Мышкин
Сообщений: 34357
Меня смущает то, что переменная @tmp не должна существовать по логике приведенного говнокода. Собственно наткнулся на подобную ошибку в реальной процедуре, где в ветке else были пропущены операторные скобки begin - end. Н-да, возможность объевлять переменные где попало развращает.

Будущего нет. И завтра не будет. ©
4 июн 09, 11:38    [7264160]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
> Меня смущает то, что переменная @tmp не должна существовать

дальше можно не продолжать. переменные видны с момента объявления и "до упора" невзирая на логику / блоки. t-sql не язык програмирования. это способ управления данными
4 июн 09, 11:43    [7264209]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
tunknown
Member

Откуда:
Сообщений: 752
Ответ следует из сообщения об ошибке

declare @q int
if 1=0
  declare @tmp varchar(100)
else
  declare @tmp varchar(1)
select @tmp
4 июн 09, 11:47    [7264239]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31200
Kull Damned
Меня смущает то, что переменная @tmp не должна существовать по логике приведенного говнокода. Собственно наткнулся на подобную ошибку в реальной процедуре, где в ветке else были пропущены операторные скобки begin - end. Н-да, возможность объевлять переменные где попало развращает.
Это вы 8 лет работали с MSSQL и только сейчас узнали, как декларировать переменные??? :-)

А то, что не работает так-же, как, например, С++... Вы бы ещё с ЛИСП-ом сравнили.
4 июн 09, 11:49    [7264258]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
Kull Damned
Member [заблокирован]

Откуда: Князь Мышкин
Сообщений: 34357
Может кто-то цитату из BOL даже приведет по этому поводу? :)

Будущего нет. И завтра не будет. ©
4 июн 09, 12:00    [7264347]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31200
Kull Damned
Может кто-то цитату из BOL даже приведет по этому поводу? :)
Ну как-же, вот:
ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.ru/s10de_6tsql/html/d1635ebb-f751-4de1-8bbc-cae161f90821.htm
"Областью локальной переменной является пакет, в котором она объявлена. "

Хотя это не совсем соответствует действительности - нельзя использовать переменную до того, как она объхявлена. Баг.
4 июн 09, 12:15    [7264457]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31200
alexeyvg
Kull Damned
Может кто-то цитату из BOL даже приведет по этому поводу? :)
Ну как-же, вот:
ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.ru/s10de_6tsql/html/d1635ebb-f751-4de1-8bbc-cae161f90821.htm
"Областью локальной переменной является пакет, в котором она объявлена. "

Хотя это не совсем соответствует действительности - нельзя использовать переменную до того, как она объхявлена. Баг.
А, вот тут точнее:
ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.ru/s10de_1devconc/html/68e1eb0f-bbe2-4854-8b40-836ece2f2d3d.htm
Областью видимости переменной называют диапазон инструкций Transact-SQL, которые могут к ней обращаться. Областью видимости переменной являются все инструкции между ее объявлением и концом пакета или хранимой процедуры, где она объявлена.
4 июн 09, 12:17    [7264476]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
andrnt
Member

Откуда: Москва
Сообщений: 86
[url=]ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.ru/tsqlref9/html/d1635ebb-f751-4de1-8bbc-cae161f90821.htm[/url]

ЗАМЕЧАНИЯ
Переменные часто используются в пакете или процедуре в качестве счетчиков для циклов WHILE, LOOP или в блоке IF...ELSE.

Переменные могут использоваться в выражениях, но не вместо имен объектов или ключевых слов. Для построения динамических инструкций SQL используйте EXECUTE.

[b]Областью локальной переменной является пакет, в котором она объявлена[/b]
4 июн 09, 12:19    [7264492]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
Kull Damned
Member [заблокирован]

Откуда: Князь Мышкин
Сообщений: 34357
alexeyvg
Kull Damned
Может кто-то цитату из BOL даже приведет по этому поводу? :)
Ну как-же, вот:
ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.ru/s10de_6tsql/html/d1635ebb-f751-4de1-8bbc-cae161f90821.htm
"Областью локальной переменной является пакет, в котором она объявлена. "

Хотя это не совсем соответствует действительности - нельзя использовать переменную до того, как она объхявлена. Баг.
Так, факт наличия бага уже признаем... Теплее, товарищи... Возникает вопрос - а в каком именно месте баг?
1. В работе оператора IF
2. В описании оператора IF
3. В работе оператора DECLARE
4. В описании оператора DECLARE

Кто-то может проверить на других версиях этот "код"?
4 июн 09, 12:20    [7264497]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
----------------------------------------------------------------------------------------------------
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) 
	Oct 14 2005 00:33:37 
	Copyright (c) 1988-2005 Microsoft Corporation
	Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 2)


(1 row(s) affected)


----------------------------------------------------------------------------------------------------
Preved!

(1 row(s) affected)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
Microsoft SQL Server  2000 - 8.00.2039 (Intel X86) 
	May  3 2005 23:18:38 
	Copyright (c) 1988-2003 Microsoft Corporation
	Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)


(1 row(s) affected)

                                                                                                     
---------------------------------------------------------------------------------------------------- 
Preved!

(1 row(s) affected)
4 июн 09, 12:24    [7264531]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31200
Kull Damned
Хотя это не совсем соответствует действительности - нельзя использовать переменную до того, как она объхявлена. Баг.
Так, факт наличия бага уже признаем... Теплее, товарищи... Возникает вопрос - а в каком именно месте баг?[/quot]Повторю ещё раз - из этого места документации следует, что можно использовать переменную до её объявления.

Например, согласно этому месту документации следует, что следующий код правильный:
select @var
declare @var int
Однако он возвращает ошибку.

Kull Damned
1. В работе оператора IF
2. В описании оператора IF
3. В работе оператора DECLARE
4. В описании оператора DECLARE

Кто-то может проверить на других версиях этот "код"?
Правильный ответ - бага нет.

Баг продукта - это несоответствие поведения продукта документации. В данном случае этого нет.

В первой ссылке просто неполное описание, без деталей.

Детализацию см. по второй ссылке.
4 июн 09, 12:38    [7264650]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31200
Отформатировал.
Kull Damned
Так, факт наличия бага уже признаем... Теплее, товарищи... Возникает вопрос - а в каком именно месте баг?
Повторю ещё раз - из этого места документации следует, что можно использовать переменную до её объявления.

Например, согласно этому месту документации следует, что следующий код правильный:
select @var
declare @var int
Однако он возвращает ошибку.

Kull Damned
1. В работе оператора IF
2. В описании оператора IF
3. В работе оператора DECLARE
4. В описании оператора DECLARE

Кто-то может проверить на других версиях этот "код"?
Правильный ответ - бага нет.

Баг продукта - это несоответствие поведения продукта документации. В данном случае этого нет.

В первой ссылке просто неполное описание, без деталей.

Детализацию см. по второй ссылке.
4 июн 09, 12:39    [7264657]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
Kull Damned
Member [заблокирован]

Откуда: Князь Мышкин
Сообщений: 34357
А что глаголит описание оператора IF?

Будущего нет. И завтра не будет. ©
4 июн 09, 12:39    [7264658]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
dymka
Member

Откуда: г. Альметьевск (Татарстан)
Сообщений: 235
Да просто получается, что declare не является оператором T-SQL, а служит для того, чтобы на этапе лексического анализа выделить область памяти под переменную, несмотря ни на какие условия. Т.е. чиста декларирование переменной.
Тупо встретил в тексте declare @tmp varchar(100) и загнал ее в таблицу переменных.
А я так понял, вы ожидали, что переменная создается во время выполнения скрипта. Ну значит это не так.
4 июн 09, 14:22    [7265342]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
то есть проблем у нас больше нет? эта - последняя осталась?
4 июн 09, 15:02    [7265601]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
Kull Damned
Member [заблокирован]

Откуда: Князь Мышкин
Сообщений: 34357
Crimean
то есть проблем у нас больше нет? эта - последняя осталась?
Нет, проблем у меня нет, кроме финансовых, да и этот случай не проблема, а так, легкое недоумение относительно логики разработчиков.
4 июн 09, 15:21    [7265739]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
Kull Damned
Member [заблокирован]

Откуда: Князь Мышкин
Сообщений: 34357
Кстати, дамы и господа, зацените фишку:
declare @a int

if 1=0
  declare cur_PR cursor local static forward_only for
    select ID
      from doc_Journ_Type

  open cur_PR

  fetch next from cur_PR into @a
  while @@fetch_status = 0 begin
    print @a

    fetch next from cur_PR into @a
  end

  close cur_PR
  deallocate cur_PR

Msg 16916, Level 16, State 1, Line 3
A cursor with the name 'cur_PR' does not exist.
Msg 16916, Level 16, State 1, Line 10
A cursor with the name 'cur_PR' does not exist.
Msg 16916, Level 16, State 1, Line 17
A cursor with the name 'cur_PR' does not exist.
Msg 16916, Level 16, State 1, Line 18
A cursor with the name 'cur_PR' does not exist.

Куда дели курсор, блин?!

Будущего нет. И завтра не будет. ©
4 июн 09, 17:32    [7266684]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31200
Kull Damned
Кстати, дамы и господа, зацените фишку:
declare @a int

if 1=0
  declare cur_PR cursor local static forward_only for
    select ID
      from doc_Journ_Type

  open cur_PR

  fetch next from cur_PR into @a
  while @@fetch_status = 0 begin
    print @a

    fetch next from cur_PR into @a
  end

  close cur_PR
  deallocate cur_PR

Msg 16916, Level 16, State 1, Line 3
A cursor with the name 'cur_PR' does not exist.
Msg 16916, Level 16, State 1, Line 10
A cursor with the name 'cur_PR' does not exist.
Msg 16916, Level 16, State 1, Line 17
A cursor with the name 'cur_PR' does not exist.
Msg 16916, Level 16, State 1, Line 18
A cursor with the name 'cur_PR' does not exist.

Куда дели курсор, блин?!

Ну, вам надо хоть немного про сиквел прочитать :-(

Просто declare @cur_PR CURSOR и declare cur_PR CURSOR - это совершенно разные конструкции, и вторая из них к переменным и к обсуждаемой теме никакого отношения не имеет:
if 1=0
  declare @cur_PR CURSOR
  
  set @cur_PR = cursor local static forward_only for
    select ID
      from doc_Journ_Type

  open @cur_PR

  fetch next from @cur_PR into @a
  while @@fetch_status = 0 begin
    print @a

    fetch next from @cur_PR into @a
  end

  close @cur_PR
  deallocate @cur_PR
4 июн 09, 17:55    [7266845]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
А вы ещё с DECLARE @Table TABLE поиграйтесь.
4 июн 09, 21:56    [7267621]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
Sevolod
Member

Откуда:
Сообщений: 106
Mnior,

А вы уверены, что все так очевидно?

Почему код

if 1=0
  declare @tmp varchar(100) 

является корректным?

Ведь код
if 1=0
сам по себе корректным не является, а declare - это не sql_statement | statement_block, который должен идти после IF согласно BOL.
19 июн 09, 14:26    [7320846]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Sevolod
Ведь код
if 1=0
сам по себе корректным не является

с чего бы это?
19 июн 09, 14:31    [7320883]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
кроме того, DECLARE - это таки "valid Transact-SQL statement"

-------------------------
There’s no silver bullet!
19 июн 09, 14:35    [7320925]     Ответить | Цитировать Сообщить модератору
 Re: Такого за 8 лет я еще не видел. Багоглюк, или так и должно быть?  [new]
Sevolod
Member

Откуда:
Сообщений: 106
locky,

Я имею в виду, что если выполнить код в QA,
if 1 = 0
то ожидаемо получите

Line 1: Incorrect syntax near '0'.

Если бы Declare .... было valid sql statement - то оно бы выполнялось только при истинности условия 1 = 0. Нет?
19 июн 09, 14:44    [7321005]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить