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

Откуда:
Сообщений: 204
написал такую процедуру:
CREATE PROCEDURE oss.p_make_report
AS
BEGIN
    declare @city1 varchar(100), @street_type1 varchar(100), @street1 varchar(100), @building1 varchar(100), @sector1 varchar(100);
    declare @flat_count1 int, @floor_count1 int, @entrance1 int, @diapazon_flat1 varchar(100), @comment_address1 varchar(100), @floor_transit_is1 int;
    declare @floor_prolet_is1 int, @chassis1 varchar(100), @port1 varchar(50), @flat_number1 varchar(100), @full_name1 varchar(100), @login1 varchar(50), @status_date1 date, @state1 varchar(100);


    declare @city2 varchar(100), @street_type2 varchar(100), @street2 varchar(100), @building2 varchar(100), @sector2 varchar(100);
    declare @flat_count2 int, @floor_count2 int, @entrance2 int, @diapazon_flat2 varchar(100), @comment_address2 varchar(100), @floor_transit_is2 int;
    declare @floor_prolet_is2 int, @chassis2 varchar(100), @port2 varchar(50), @flat_number2 varchar(100), @full_name2 varchar(100), @login2 varchar(50),@status_date2 date, @state2 varchar(100);
            
       
    DECLARE p1 CURSOR FOR select city, street_type, street,building,sector, 
    flat_count, floor_count,entrance, diapazon_flat,comment_address,floor_transit_is,
    floor_prolet_is, chassis,port,flat_number,full_name,login,STATUS_DATE,state
    from oss.f_v_client_entrance('50000004')  
    order by street_type, street, building, entrance, flat_number;
    
    DECLARE p2 CURSOR FOR select city,street_type,street,building,sector, 
    flat_count,floor_count,entrance,diapazon_flat,comment_address,floor_transit_is,
    floor_prolet_is,chassis,port,flat_number,full_name,login,STATUS_DATE,state
    from oss.f_v_client_entrance('50000004')  
    order by street_type, street, building, entrance, flat_number;
    
   declare @ct varchar(300);
   
   SET @ct = 'CREATE TABLE [oss].[rtable] (
  [city] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [street_type] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [street] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [building] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [sector] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [flat_count] int NULL,
  [floor_count] int NULL,
  [entrance] int NULL,
  [diapazon_flat] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [comment_address] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [floor_transit_is] int NULL,
  [floor_prolet_is] int NULL,
  [chassis] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [port] varchar(50) COLLATE Cyrillic_General_CI_AS NULL,
  [flat_number] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [full_name] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [login] varchar(50) COLLATE Cyrillic_General_CI_AS NULL,
  [status_date] date NULL,
  [state] varchar(100) COLLATE Cyrillic_General_CI_AS NULL
)';

if (OBJECT_ID (N'rtable', N'U')) IS NULL execute(@ct);     
IF OBJECT_ID (N'rtable', N'U') IS NOT NULL delete from rtable;

open p1;
open p2;

    FETCH NEXT FROM p1 INTO @city1, @street_type1, @street1, @building1, @sector1, @flat_count1, @floor_count1, @entrance1, @diapazon_flat1,@comment_address1, @floor_transit_is1, @floor_prolet_is1, @chassis1, @port1, @flat_number1, @full_name1, @login1,
@status_date1, @state1;
     
    FETCH NEXT FROM p2 INTO @city2, @street_type2, @street2, @building2, @sector2, @flat_count2, @floor_count2, @entrance2, @diapazon_flat2,@comment_address2, @floor_transit_is2, @floor_prolet_is2, @chassis2, @port2, @flat_number2, @full_name2, @login2,
@status_date2, @state2;
        
    WHILE (1=1)
       begin
       
         FETCH NEXT FROM p2 INTO @city2, @street_type2, @street2, @building2, @sector2, @flat_count2, @floor_count2, @entrance2, @diapazon_flat2,@comment_address2, @floor_transit_is2, @floor_prolet_is2, @chassis2, @port2, @flat_number2, @full_name2, @login2,
@status_date2, @state2;

	     if (@@FETCH_STATUS != 0) break;
         
       
             if (@building1 = @building2)
                begin

                   if(@entrance1 = @entrance2)
                        insert into rtable (chassis,port,flat_number,full_name,login,STATUS_DATE,state) 
                        values (@chassis2,@port2,@flat_number2,@full_name2,@login2,@status_date2,@state2);
                   else
                        insert into rtable (entrance,diapazon_flat,floor_transit_is,floor_prolet_is,chassis,port,
                                                flat_number,full_name,login,STATUS_DATE,state) 
                        values (@entrance2,@diapazon_flat2,@floor_transit_is2,@floor_prolet_is2,
                                  @chassis2,@port2,@flat_number2,@full_name2,@login2,@status_date2,@state2);
                end;
             else 
                insert into rtable (city, street_type, street, building, sector, flat_count, floor_count, entrance, diapazon_flat, 
                                        comment_address, floor_transit_is, floor_prolet_is, chassis, port, flat_number, full_name, login,
                                        status_date, state) 
                values (@city2, @street_type2, @street2, @building2, @sector2, @flat_count2, @floor_count2, @entrance2,                      
                           @diapazon_flat2,@comment_address2, @floor_transit_is2, @floor_prolet_is2, @chassis2, @port2, 
                           @flat_number2,@full_name2,@login2,@status_date2,@state2);

	     FETCH NEXT FROM p1 INTO @city1, @street_type1, @street1, @building1, @sector1, @flat_count1, @floor_count1, @entrance1, @diapazon_flat1, @comment_address1, @floor_transit_is1, @floor_prolet_is1, @chassis1, @port1, @flat_number1, @full_name1, @login1,@status_date1, @state1;
                            
      end;
    
       
     close p1;
     close p2;
     
     DEALLOCATE p1;
     DEALLOCATE p2;
END


Когда таблицы rtable не существует, то выдается ошибка курсор p1 уже существует. В чем причина, не могу понять?
8 янв 15, 18:30    [17094802]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
baza906
Member

Откуда:
Сообщений: 283
relav, а процедура вообще нормально работает? а то цикла BEGIN...END нету
8 янв 15, 19:07    [17094921]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
_djХомяГ
Guest
1 Не понятно зачем здесь динамика -exec
2 Почему первоначально не создать нормальную таблицу rtable, а потом уже переходить к вызову процедуры
PS В тексте много букфф - особо не разбирался
8 янв 15, 19:23    [17094977]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
relav,

А на кой вам там вообще курсоры?
8 янв 15, 20:06    [17095104]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
relav
Member

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

что вы имеете ввиду под циклом begin end?
9 янв 15, 00:41    [17095591]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
relav
Member

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

процедура делает следующее: устанавливаются два курсора на исходную(первую) таблицу, а затем формируется вторая таблица на основе строк первой таблицы модифицируя их исходя из информации первого и второго курсора.
9 янв 15, 00:45    [17095599]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
relav
Mind,

процедура делает следующее: устанавливаются два курсора на исходную(первую) таблицу, а затем формируется вторая таблица на основе строк первой таблицы модифицируя их исходя из информации первого и второго курсора.
А почему не 8 курсоров? Так же прикольнее, чем писать унылый запрос из трех строк.
9 янв 15, 00:49    [17095606]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
relav
Member

Откуда:
Сообщений: 204
Гавриленко Сергей Алексеевич,

а что можно написать запрос, который будет модифицировать таблицу нужным образом? Мне нужно из первой таблицы удалить определенные поля и тем самым сформировать вторую таблицу.
9 янв 15, 00:56    [17095617]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
relav
Member

Откуда:
Сообщений: 204
в первой таблице содержаться данные о жильцах в домах. Если мы в таблице наталкиваемся на новый дом, то нужно вывести всю строку, а если переход осуществляется к другому подъезду того же дома, то выводится частичная сторока, а если подъезд и дом одинаков, то выводится только жилец квартиры.
9 янв 15, 00:59    [17095622]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
relav
в первой таблице содержаться данные о жильцах в домах. Если мы в таблице наталкиваемся на новый дом, то нужно вывести всю строку, а если переход осуществляется к другому подъезду того же дома, то выводится частичная сторока, а если подъезд и дом одинаков, то выводится только жилец квартиры.
Вам небось отчет построить надо? Ну так возьмите любой тул для построения отчетов, тот же SSRS например, и сделайте это за 5 минут. А то удаляете гланды через ж.
9 янв 15, 01:23    [17095666]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
Glory
Member

Откуда:
Сообщений: 104751
relav
В чем причина, не могу понять?

Вы хоть знаете оригинальный текст сообщения ? И строку вашего кода, на которой происходит ошибка ?
9 янв 15, 09:09    [17095959]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
скорее всего у него неправильно заполняються таблицы... бо один курсор еще на первом шаге переопределяться вторым проходом. Т.е. он честно ждет что получит одинаковый порядок записей в обоих курсорах А в ответ - тишина..ибо фетч по второму курсору сразу в начале цикла и "первых" значений вообще никогда не будет . А вообще канечно - фееерично
9 янв 15, 12:23    [17096258]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
Axeleron
Member

Откуда: London
Сообщений: 7531
Блин, вот сейчас на работе приходится постоянно с подобным кодом как у TCа иметь дело, в основном фиксить баги. Такая срань, скажу я Вам! По-первых кучу времени приходится тратить на то, 'что он хотел этим сказать?!', потом читать спецификацию, выкидывать все нафиг и просто переписывать код нафиг заново. Откуда вообще такие кодеры берутся? Почему они элементарно не хотят думать что (и хотя бы немного о том КАК) они пишут? Сорри за оффтоп.
9 янв 15, 12:43    [17096349]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
o-o
Guest
а давайте откроем курсоросрач?
и поделимся, кому что перепадает!
у нас вот, на мой взгляд, маразм круче: курсор -- "священная корова" начальницы.
трогать нельзя.
когда процедура с кодом "уходит и не возвращается", написанное трогать все равно нельзя,
а приходится переписывать под тем же именем, только класть в другую схему и ей отдавать.
и в довершение всего надо объяснять, не почему мое работает, а ее "задумывается",
а почему до вчерашнего дня оно пахало, а сегодня заглохло, и как это при этом переписанное все равно пашет
9 янв 15, 13:06    [17096449]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
o-o,

а смсысл в сраче то ?
Давайте лучше VLF продолжимс (с) Па Добраму
9 янв 15, 13:19    [17096512]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
o-o
Guest
Maxx,
я когда проверю идею, выложу,
я же не злюсь по-правде, это было временное мимолетное возмущение и вообще из серии советов/поводов задуматься:
если игнорить ответы, то кто отвечать-то будет?

что-то кроме HEX EDITOR-а не вижу способов проверить, и ужасно лень байтики считать
просто там передо мной поделились курсорным опытом, а мне тоже хочется пожаловаться, всяко лучше, чем биться головой

К сообщению приложен файл. Размер - 2Kb
9 янв 15, 14:33    [17096857]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
relav
Member

Откуда:
Сообщений: 204
переписал немного процедуру. Теперь она работает с одним курсором.
CREATE PROCEDURE oss.p_make_report
AS
BEGIN
    declare @city_s varchar(100), @street_type_s varchar(100), @street_s varchar(100), @building_s varchar(100), @sector_s varchar(100);
    declare @flat_count_s int, @floor_count_s int, @entrance_s int, @diapazon_flat_s varchar(100), @comment_address_s varchar(100), @floor_transit_is_s int;
    declare @floor_prolet_is_s int, @chassis_s varchar(100), @port_s varchar(50), @flat_number_s varchar(100), @full_name_s varchar(100), @login_s varchar(50),
            @status_date_s date, @state_s varchar(100);


    declare @city varchar(100), @street_type varchar(100), @street varchar(100), @building varchar(100), @sector varchar(100);
    declare @flat_count int, @floor_count int, @entrance int, @diapazon_flat varchar(100), @comment_address varchar(100), @floor_transit_is int;
    declare @floor_prolet_is int, @chassis varchar(100), @port varchar(50), @flat_number varchar(100), @full_name varchar(100), @login varchar(50),
            @status_date date, @state varchar(100);
            
    declare @i int,@j int;
            
    DECLARE cur CURSOR FOR select city,street_type,street,building,sector, 
    flat_count,floor_count,entrance,diapazon_flat,comment_address,floor_transit_is,
    floor_prolet_is,chassis,port,flat_number,full_name,login,STATUS_DATE,state
    from oss.f_v_client_entrance('50000004')  
    order by street_type, street, building, entrance, flat_number;
   
   declare @ct varchar(300);
    
    
   SET @ct = 'CREATE TABLE [oss].[rtable] (
  [city] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [street_type] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [street] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [building] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [sector] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [flat_count] int NULL,
  [floor_count] int NULL,
  [entrance] int NULL,
  [diapazon_flat] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [comment_address] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [floor_transit_is] int NULL,
  [floor_prolet_is] int NULL,
  [chassis] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [port] varchar(50) COLLATE Cyrillic_General_CI_AS NULL,
  [flat_number] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [full_name] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [login] varchar(50) COLLATE Cyrillic_General_CI_AS NULL,
  [status_date] date NULL,
  [state] varchar(100) COLLATE Cyrillic_General_CI_AS NULL
)';

    if (OBJECT_ID (N'rtable', N'U')) IS NULL execute(@ct);     
    if (OBJECT_ID (N'rtable', N'U')) IS NOT NULL delete from rtable;

    open cur;

    FETCH NEXT FROM cur INTO @city, @street_type, @street, @building, @sector, @flat_count, @floor_count, @entrance, @diapazon_flat, 
                             @comment_address, @floor_transit_is, @floor_prolet_is, @chassis, @port, @flat_number, @full_name, @login,
                             @status_date, @state;
    
    insert into rtable (city, street_type, street, building, sector, flat_count, floor_count, entrance, diapazon_flat, 
                        comment_address, floor_transit_is, floor_prolet_is, chassis, port, flat_number, full_name, login,
                        status_date, state) 
    values (@city, @street_type, @street, @building, @sector, @flat_count, @floor_count, @entrance,                                                      
            @diapazon_flat,@comment_address, @floor_transit_is, @floor_prolet_is, @chassis, @port, 
            @flat_number,@full_name,@login,@status_date,@state);
           
        
    WHILE (1=1)
       begin
         
         SET @city_s = @city; 
         SET @street_type_s = @street_type; 
         SET @street_s = @street;
         SET @building_s = @building;
         SET @sector_s = @sector;
         SET @flat_count_s = @flat_count; 
         SET @floor_count_s = @floor_count;
         SET @entrance_s = @entrance;
         SET @diapazon_flat_s = @diapazon_flat;
         SET @comment_address_s = @comment_address;
         SET @floor_transit_is_s = @floor_transit_is;
         SET @floor_prolet_is_s = @floor_prolet_is;
         SET @chassis_s = @chassis;
         SET @port_s = @port;
         SET @flat_number_s = @flat_number;
         SET @full_name_s = @full_name;
         SET @login_s = @login;
         SET @status_date_s = @status_date;
         SET @state_s = @state;
       
         FETCH NEXT FROM cur INTO @city, @street_type, @street, @building, @sector, @flat_count, @floor_count, @entrance, @diapazon_flat, 
                                  @comment_address, @floor_transit_is, @floor_prolet_is, @chassis, @port, @flat_number, @full_name, @login,
                                  @status_date, @state;

         if (@@FETCH_STATUS != 0) break;
         
         if (@building_s = @building)
            begin

               if(@entrance_s = @entrance)
                    insert into rtable (chassis,port,flat_number,full_name,login,STATUS_DATE,state) 
                    values (@chassis,@port,@flat_number,@full_name,@login,@status_date,@state);
               else
                  insert into rtable (entrance,diapazon_flat,floor_transit_is,floor_prolet_is,chassis,port,
                                      flat_number,full_name,login,STATUS_DATE,state) 
                  values (@entrance,@diapazon_flat,@floor_transit_is,@floor_prolet_is,
                          @chassis,@port,@flat_number,@full_name,@login,@status_date,@state);
            end;
         else
                 
           insert into rtable (city, street_type, street, building, sector, flat_count, floor_count, entrance, diapazon_flat, 
                               comment_address, floor_transit_is, floor_prolet_is, chassis, port, flat_number, full_name, login,
                               status_date, state) 
           values (@city, @street_type, @street, @building, @sector, @flat_count, @floor_count, @entrance,                                                      
                   @diapazon_flat,@comment_address, @floor_transit_is, @floor_prolet_is, @chassis, @port, 
                   @flat_number,@full_name,@login,@status_date,@state);

      end;
    
     close cur;
     
     DEALLOCATE cur;
END


Выдается следующие сообщение см. вложенный файл.

К сообщению приложен файл. Размер - 17Kb
9 янв 15, 15:00    [17096953]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
а что за приложение такое ???? По виду ответ не студийный
9 янв 15, 15:33    [17097036]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
Jovanny
Member

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

У вас, наверное,
SET CURSOR_DEFAULT  GLOBAL
9 янв 15, 15:58    [17097133]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
relav
Member

Откуда:
Сообщений: 204
еще раз переделал процедуру. Теперь это функция, которая возвращает таблицу.
CREATE FUNCTION oss.f_view_report(@org int)
RETURNS @rtable TABLE
 ([city] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [street_type] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [street] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [building] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [sector] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [flat_count] int NULL,
  [floor_count] int NULL,
  [entrance] int NULL,
  [diapazon_flat] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [comment_address] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [floor_transit_is] int NULL,
  [floor_prolet_is] int NULL,
  [chassis] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [port] varchar(50) COLLATE Cyrillic_General_CI_AS NULL,
  [flat_number] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [full_name] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
  [login] varchar(50) COLLATE Cyrillic_General_CI_AS NULL,
  [status_date] date NULL,
  [state] varchar(100) COLLATE Cyrillic_General_CI_AS NULL)
AS
BEGIN
    declare @city_s varchar(100), @street_type_s varchar(100), @street_s varchar(100), @building_s varchar(100), @sector_s varchar(100);
    declare @flat_count_s int, @floor_count_s int, @entrance_s int, @diapazon_flat_s varchar(100), @comment_address_s varchar(100), @floor_transit_is_s int;
    declare @floor_prolet_is_s int, @chassis_s varchar(100), @port_s varchar(50), @flat_number_s varchar(100), @full_name_s varchar(100), @login_s varchar(50),
            @status_date_s date, @state_s varchar(100);


    declare @city varchar(100), @street_type varchar(100), @street varchar(100), @building varchar(100), @sector varchar(100);
    declare @flat_count int, @floor_count int, @entrance int, @diapazon_flat varchar(100), @comment_address varchar(100), @floor_transit_is int;
    declare @floor_prolet_is int, @chassis varchar(100), @port varchar(50), @flat_number varchar(100), @full_name varchar(100), @login varchar(50),
            @status_date date, @state varchar(100);
            
                
    DECLARE cur CURSOR FOR select city,street_type,street,building,sector, 
    flat_count,floor_count,entrance,diapazon_flat,comment_address,floor_transit_is,
    floor_prolet_is,chassis,port,flat_number,full_name,login,STATUS_DATE,state
    from oss.f_v_client_entrance (@org)  
    order by street_type, street, building, entrance, flat_number;
   
    open cur;
   
    FETCH NEXT FROM cur INTO @city, @street_type, @street, @building, @sector, @flat_count, @floor_count, @entrance, @diapazon_flat, 
                             @comment_address, @floor_transit_is, @floor_prolet_is, @chassis, @port, @flat_number, @full_name, @login,
                             @status_date, @state;
    
    insert into @rtable (city, street_type, street, building, sector, flat_count, floor_count, entrance, diapazon_flat, 
                        comment_address, floor_transit_is, floor_prolet_is, chassis, port, flat_number, full_name, login,
                        status_date, state) 
    values (@city, @street_type, @street, @building, @sector, @flat_count, @floor_count, @entrance,                                                      
            @diapazon_flat,@comment_address, @floor_transit_is, @floor_prolet_is, @chassis, @port, 
            @flat_number,@full_name,@login,@status_date,@state);
           
        
    WHILE (1=1)
       begin
           
         SET @city_s = @city; 
         SET @street_type_s = @street_type; 
         SET @street_s = @street;
         SET @building_s = @building;
         SET @sector_s = @sector;
         SET @flat_count_s = @flat_count; 
         SET @floor_count_s = @floor_count;
         SET @entrance_s = @entrance;
         SET @diapazon_flat_s = @diapazon_flat;
         SET @comment_address_s = @comment_address;
         SET @floor_transit_is_s = @floor_transit_is;
         SET @floor_prolet_is_s = @floor_prolet_is;
         SET @chassis_s = @chassis;
         SET @port_s = @port;
         SET @flat_number_s = @flat_number;
         SET @full_name_s = @full_name;
         SET @login_s = @login;
         SET @status_date_s = @status_date;
         SET @state_s = @state;
       
         FETCH NEXT FROM cur INTO @city, @street_type, @street, @building, @sector, @flat_count, @floor_count, @entrance, @diapazon_flat, 
                                  @comment_address, @floor_transit_is, @floor_prolet_is, @chassis, @port, @flat_number, @full_name, @login,
                                  @status_date, @state;
  
         if (@@FETCH_STATUS != 0) break;
         
         if (@building_s = @building)
            begin

               if(@entrance_s = @entrance)
                    insert into @rtable (chassis,port,flat_number,full_name,login,STATUS_DATE,state) 
                    values (@chassis,@port,@flat_number,@full_name,@login,@status_date,@state);
               else
                  insert into @rtable (entrance,diapazon_flat,floor_transit_is,floor_prolet_is,chassis,port,
                                      flat_number,full_name,login,STATUS_DATE,state) 
                  values (@entrance,@diapazon_flat,@floor_transit_is,@floor_prolet_is,
                          @chassis,@port,@flat_number,@full_name,@login,@status_date,@state);
            end;
         else
                 
           insert into @rtable (city, street_type, street, building, sector, flat_count, floor_count, entrance, diapazon_flat, 
                               comment_address, floor_transit_is, floor_prolet_is, chassis, port, flat_number, full_name, login,
                               status_date, state) 
           values (@city, @street_type, @street, @building, @sector, @flat_count, @floor_count, @entrance,                                                      
                   @diapazon_flat,@comment_address, @floor_transit_is, @floor_prolet_is, @chassis, @port, 
                   @flat_number,@full_name,@login,@status_date,@state);

      end;

     close cur;
     DEALLOCATE cur;
     
     return
END


она работает. т.е. ошибки предыдущей уже не выдает.Но работает медленно аж 2:30 минут, что не хорошо. Как бы можно было оптимизировать данную функцию? может можно курсор чем-то заменить, а то читал, что курсоры не быстро работают. Или поставить индекс на временную таблицу, если такое возможно.
9 янв 15, 16:49    [17097332]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Вы задачу опишите свою. Ковыряться в вашем километровом курсоре не интересно ни разу.
9 янв 15, 16:55    [17097349]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
что делатет вот ето ф-ция oss.f_v_client_entrance () ?
ПО виду вам тут курсор нужен как зайцу стоп сигнал...
по сущевту вы сравниваете строки отсортированые в етом порядке street_type, street, building, entrance, flat_number и в зависимости от @building и @entrance вставляете разные строки в тиоговую таблицу из выборки - ето все можно сделать 1 селектом .
Что правда у вас странные проверки как по мне
На разных улицах может запросто быть дом в один и тем же номером и первым подьездом - не находите ?
9 янв 15, 16:55    [17097351]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
relav
Member

Откуда:
Сообщений: 204
все заработало. Но, у меня еще один вопрос: как можно добавить индекс на временную таблицу?
9 янв 15, 17:02    [17097378]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
relav
все заработало. Но, у меня еще один вопрос: как можно добавить индекс на временную таблицу?

а как вы добавляете на обычную ????
9 янв 15, 17:04    [17097384]     Ответить | Цитировать Сообщить модератору
 Re: курсор  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Maxx
relav
все заработало. Но, у меня еще один вопрос: как можно добавить индекс на временную таблицу?

а как вы добавляете на обычную ????

а накуа вам индекс при операции INSERT ?
9 янв 15, 17:05    [17097387]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить