Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Неправильно работает курсор  [new]
romasimeiz
Member

Откуда:
Сообщений: 55
Добрый день! Подскажите пожалуйста, что я не правильно делаю:

У меня есть запрос:
select gid, vparam from [ORASERV]..[RYDA].[GROUPS] where vparam like '%SAP%' 
, если его выполнить отдельно, то он выдаёт то, что мне нужно. 2 строчки где правильно заполнены 2 столбика gid и vparam.
Теперь я пишу процедуру с курсором в который помещаются данные из того же запроса:

DECLARE @SWV_C_gid VARCHAR(255)
DECLARE @SWV_C_vparam VARCHAR(255)   
DECLARE @SWV_cursor_var1 CURSOR 
SET @SWV_cursor_var1 = CURSOR FOR select gid, vparam from [ORASERV]..[RYDA].[GROUPS] where vparam like '%SAP%' 
   OPEN @SWV_cursor_var1
   FETCH NEXT FROM @SWV_cursor_var1 INTO @SWV_C_gid,@SWV_C_vparam
   while @@FETCH_STATUS = 0
   begin
-- и так далее


При помощи отладчика, я увидел, что в данном случае в переменные @SWV_C_vparam и @SWV_C_gid помещаются абсолютно неправильные данные. Тоже 2 строчки как и в запросе, но данные другие и строчки одинаковые.
Что я неправильно делаю?
Почему не срабатывает запрос?
Заранее спасибо!!!
25 ноя 14, 16:13    [16903126]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
Glory
Member

Откуда:
Сообщений: 104760
romasimeiz
я увидел, что в данном случае в переменные @SWV_C_vparam и @SWV_C_gid помещаются абсолютно неправильные данные.

И в чем состоит неправильность этих данных в данном случае?

romasimeiz
Тоже 2 строчки как и в запросе, но данные другие и строчки одинаковые.

Что за "две строчки" ? У вас две переменные, в которые можно занести только по одному значению одного поля одной записи
25 ноя 14, 16:17    [16903151]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
romasimeiz
Member

Откуда:
Сообщений: 55
Glory,
По порядку:
1. Делаю просто select:
Возвращает мне 2 строчки вот такие:
gid vparam
8700 SAP
9280 SAP

2. Курсор в функции делает тот же select

Возвращает 2 строчки:
gid vparam
8327 NULL
8327 NULL
25 ноя 14, 16:23    [16903208]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
romasimeiz
Member

Откуда:
Сообщений: 55
две строчки, я имел ввиду, когда полностью отработает функция.
25 ноя 14, 16:24    [16903213]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
Glory
Member

Откуда:
Сообщений: 104760
romasimeiz
Возвращает 2 строчки:
gid vparam
8327 NULL
8327 NULL

Ваш курсор что-то заносит в переменные.
Для того, чтобы узнать, что же он возвращает убирают INTO @SWV_C_gid,@SWV_C_vparam
25 ноя 14, 16:24    [16903217]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
romasimeiz
Glory,
По порядку:
1. Делаю просто select:
Возвращает мне 2 строчки вот такие:
gid vparam
8700 SAP
9280 SAP

2. Курсор в функции делает тот же select

Возвращает 2 строчки:
gid vparam
8327 NULL
8327 NULL
Внутри цикла FETCH NEXT, надеюсь, тоже делаете?
25 ноя 14, 16:27    [16903238]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Кстати, зачем эта переменная типа CURSOR?
А вообще, курсор обязателен? По-другому никак?
25 ноя 14, 16:29    [16903254]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
romasimeiz
Member

Откуда:
Сообщений: 55
автор
Внутри цикла FETCH NEXT, надеюсь, тоже делаете?


FETCH NEXT FROM @SWV_cursor_var1 INTO @SWV_C_gid,@SWV_C_vparam   
   while @@FETCH_STATUS = 0
   begin      
      SET @sap_id_ = SUBSTRING(@SWV_C_vparam,CHARINDEX('SAP',@SWV_C_vparam)+3,100);
      WITH SWA_Al(mid,inverted)
      AS (SELECT mid,inverted
      FROM ORASERV..RYDA.GROUPS
      WHERE gid = @SWV_C_gid AND mid is not null
      UNION ALL
     SELECT SWA_cols_levelplus1.mid,SWA_cols_levelplus1.inverted
      FROM ORASERV..RYDA.GROUPS AS SWA_cols_levelplus1, SWA_Al
      WHERE SWA_cols_levelplus1.gid = SWA_cols_levelplus1.parent AND SWA_cols_levelplus1.mid is not null)
      select   @er_ = sum(CASE g.inverted WHEN 'y' THEN -1 ELSE 1 END*er)
      from(SELECT mid,inverted
         FROM SWA_Al) g,
        ORASERV..RYDA.HALFHOUROLD h
      where h.mid = g.mid
      and h.date_time <= @dt + convert(decimal,20)/24
      and h.date_time >  @dt -convert(decimal,4)/24 
      insert into dbo.halfhour(date_time, gid, sap_id, er)
      values(@dt, @SWV_C_gid, @sap_id_, @er_)
      FETCH NEXT FROM @SWV_cursor_var1 INTO @SWV_C_gid,@SWV_C_vparam
   end
   CLOSE @SWV_cursor_var1


Glory
Ваш курсор что-то заносит в переменные.

Мне нужно, чтобы в цикле заносил как раз то, что получает select. Посмотрел примеры, везде делается таким же образом.
25 ноя 14, 16:43    [16903363]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
Glory
Member

Откуда:
Сообщений: 104760
romasimeiz
Мне нужно, чтобы в цикле заносил как раз то, что получает select. Посмотрел примеры, везде делается таким же образом.

Да ради бога
Только о чем вы тогда просите, если вместо вывода курсора показывает значения ваших переменных
25 ноя 14, 16:46    [16903376]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
romasimeiz
Member

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

Вывел курсор, убрав
into --переменные

Показывает всё то же.

gid vparam
8327 NULL
25 ноя 14, 16:50    [16903399]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
romasimeiz
Glory,
По порядку:
1. Делаю просто select:
Возвращает мне 2 строчки вот такие:
gid vparam
8700 SAP
9280 SAP

2. Курсор в функции делает тот же select

Возвращает 2 строчки:
gid vparam
8327 NULL
8327 NULL
Покажите код, с помощью которого вы это увидели. Я не вижу в вашем коде отладочного выводи этих переменных.

Под "Возвращает 2 строчки" вы же имели в виду, что в переменных оказываются соответствеующие значение, или что?
25 ноя 14, 16:53    [16903418]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
Glory
Member

Откуда:
Сообщений: 104760
DECLARE mycursor CURSOR FOR select gid, vparam from [ORASERV]..[RYDA].[GROUPS] where vparam like '%SAP%' 
OPEN mycursor
FETCH NEXT FROM mycursor
while @@FETCH_STATUS = 0
begin
   FETCH NEXT FROM mycursor
end
CLOSE mycursor
DEALLOCATE mycursor
25 ноя 14, 16:53    [16903423]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
в ХП сделайте временную табличную переменную и в неё вставьте сначала данные из внешнего источника, а курсор уже по не ней организуйте


...
declare @t table(gid varchar(255), vparam varchar(255))

insert into @t (gid, vparam)
select gid, vparam from [ORASERV]..[RYDA].[GROUPS] where vparam like '%SAP%'

select gid, vpram from @t

...
25 ноя 14, 16:55    [16903434]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
romasimeiz
Member

Откуда:
Сообщений: 55
alexeyvg,
1. В SQL Server Management Studio создаю обычный запрос:
select gid, vparam from [ORASERV]..[RYDA].[GROUPS] where vparam like '%SAP%'
Результат: в окошке появляется табличка:
gid vparam
8700 SAP
9280 SAP

2.
delete from dbo.halfhour
	DECLARE @sap_id_       VARCHAR(100)
   DECLARE @er_           FLOAT   
   DECLARE @dt DATETIME = '28.05.2014'   
   DECLARE @SWV_C_gid VARCHAR(255)
   DECLARE @SWV_C_vparam VARCHAR(255)   
   DECLARE @SWV_cursor_var1 CURSOR 
   SET @SWV_cursor_var1 = CURSOR FOR select gid, vparam from [ORASERV]..[RYDA].[GROUPS] where vparam like '%SAP%' 
   OPEN @SWV_cursor_var1
   FETCH NEXT FROM @SWV_cursor_var1 INTO @SWV_C_gid,@SWV_C_vparam  -- отладчик показывает значение переменных  @SWV_C_gid,@SWV_C_vparam, в них должно быть по идее 8700 и SAP, но на самом деле 8327 NULL
   while @@FETCH_STATUS = 0
   begin      
      SET @sap_id_ = SUBSTRING(@SWV_C_vparam,CHARINDEX('SAP',@SWV_C_vparam)+3,100);
      WITH SWA_Al(mid,inverted)
      AS (SELECT mid,inverted
      FROM ORASERV..RYDA.GROUPS
      WHERE gid = @SWV_C_gid AND mid is not null
      UNION ALL
     SELECT SWA_cols_levelplus1.mid,SWA_cols_levelplus1.inverted
      FROM ORASERV..RYDA.GROUPS AS SWA_cols_levelplus1, SWA_Al
      WHERE SWA_cols_levelplus1.gid = SWA_cols_levelplus1.parent AND SWA_cols_levelplus1.mid is not null)
      select   @er_ = sum(CASE g.inverted WHEN 'y' THEN -1 ELSE 1 END*er)
      from(SELECT mid,inverted
         FROM SWA_Al) g,
        ORASERV..RYDA.HALFHOUROLD h
      where h.mid = g.mid
      and h.date_time <= @dt + convert(decimal,20)/24
      and h.date_time >  @dt -convert(decimal,4)/24 
      insert into dbo.halfhour(date_time, gid, sap_id, er)
      values(@dt, @SWV_C_gid, @sap_id_, @er_)
      FETCH NEXT FROM @SWV_cursor_var1 INTO @SWV_C_gid,@SWV_C_vparam
   end
   CLOSE @SWV_cursor_var1
25 ноя 14, 16:59    [16903460]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
Glory
Member

Откуда:
Сообщений: 104760
romasimeiz
2.

И как вы в предложенном скрипте видите, что
- вернул курсор
- что в итоге оказалось в переменных
25 ноя 14, 17:00    [16903473]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
romasimeiz
Member

Откуда:
Сообщений: 55
Создал. В ней находятся сейчас правильные значения.

Konst_One
в ХП сделайте временную табличную переменную и в неё вставьте сначала данные из внешнего источника, а курсор уже по не ней организуйте


Простите, я плохо разбираюсь в T-SQL, а можно поподробнее?
Как организовать по этой таблице курсор?
25 ноя 14, 17:03    [16903496]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
romasimeiz
alexeyvg,
1. В SQL Server Management Studio создаю обычный запрос:
select gid, vparam from [ORASERV]..[RYDA].[GROUPS] where vparam like '%SAP%'
Результат: в окошке появляется табличка:
gid vparam
8700 SAP
9280 SAP

2.
FETCH NEXT FROM @SWV_cursor_var1 INTO @SWV_C_gid,@SWV_C_vparam  -- отладчик показывает значение переменных  @SWV_C_gid,@SWV_C_vparam, 
-- в них должно быть по идее 8700 и SAP, но на самом деле 8327 NULL
   while @@FETCH_STATUS = 0
   begin      
-- Неважно, что показывает отладчик, просто вставьте сюда 
      SELECT @SWV_C_gid as SWV_C_gid,@SWV_C_vparam as SWV_C_vparam
25 ноя 14, 17:07    [16903514]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
romasimeiz
Member

Откуда:
Сообщений: 55
Glory
romasimeiz
2.

И как вы в предложенном скрипте видите, что
- вернул курсор
- что в итоге оказалось в переменных


Элементарно - в отладчике. Убрал INTO в переменные и когда дошёл шаг до строчки FETCH NEXT FROM @SWV_cursor_var1, увидел значение курсора.
В итоге результат работы функции, как я и писал выше
gid vparam
8327 NULL
8327 NULL
25 ноя 14, 17:08    [16903517]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
Glory
Member

Откуда:
Сообщений: 104760
romasimeiz
Элементарно - в отладчике.

Вы очень круты для "Простите, я плохо разбираюсь в T-SQL"
Вы в состоянии скопировать и выполнить предложенный вам код ?
25 ноя 14, 17:09    [16903521]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
romasimeiz
Member

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

Первая итерация цикла :
SWV_C_gid SWV_C_vparam
NULL NULL
Вторая:
SWV_C_gid SWV_C_vparam
8327 NULL
25 ноя 14, 17:11    [16903539]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
romasimeiz
-- Неважно, что показывает отладчик, просто вставьте сюда 
      SELECT @SWV_C_gid as SWV_C_gid,@SWV_C_vparam as SWV_C_vparam


Да, и ещё запрос select gid, vparam from [ORASERV]..[RYDA].[GROUPS] where vparam like '%SAP%'
вставьте перед объявлением курсора.

А то мало ли, может, в другом окошке у вас другой пользователь, другой сервер, другая база...

Но вообще я не исключаю всяких чудес при работе с внешними не MSSQL серверами. Так что, может, придётся и через временную таблицу.

romasimeiz
Простите, я плохо разбираюсь в T-SQL, а можно поподробнее?
Как организовать по этой таблице курсор?

Да так же как и по постоянной, синтаксис не меняется.

Впрочем, в тексте вашего ужасного скрипта с курсорами я не вижу ничего, для чего нужен курсор, можно просто написать запрос, будет проще и быстрее.
25 ноя 14, 17:12    [16903543]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
romasimeiz
Member

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

Простите..

Вернуло вот что :

gid vparam
8327 NULL

gid vparam
8327 NULL

gid vparam
25 ноя 14, 17:14    [16903559]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
romasimeiz
Создал. В ней находятся сейчас правильные значения.

Konst_One
в ХП сделайте временную табличную переменную и в неё вставьте сначала данные из внешнего источника, а курсор уже по не ней организуйте


Простите, я плохо разбираюсь в T-SQL, а можно поподробнее?
Как организовать по этой таблице курсор?



DECLARE @SWV_C_gid VARCHAR(255)
DECLARE @SWV_C_vparam VARCHAR(255)   
declare @t table(gid varchar(255), vparam varchar(255))

insert into @t (gid, vparam)
select gid, vparam from [ORASERV]..[RYDA].[GROUPS] where vparam like '%SAP%';

DECLARE SW_Cursor CURSOR FOR select gid, vparam from @t;

OPEN SW_Cursor;

FETCH NEXT FROM SW_Cursor INTO @SWV_C_gid, @SWV_C_vparam;
WHILE @@FETCH_STATUS = 0
BEGIN

    SELECT @SWV_C_gid as SWV_C_gid,@SWV_C_vparam as SWV_C_vparam;
    FETCH NEXT FROM SW_Cursor
END;

CLOSE SW_Cursor;
DEALLOCATE SW_Cursor;



вот это выполните
25 ноя 14, 17:17    [16903585]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает курсор  [new]
romasimeiz
Member

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

Спасибо большое! Работает!!!!!
25 ноя 14, 17:29    [16903675]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить