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

Откуда:
Сообщений: 10
Здравствуйте.
Изучаю SQL чуть более месяца, поэтому прошу простить, если подобная тема уже была, а я не нашел в ней ответы.
Мне нужно создать последовательный курсор на заполнение данных.
Таблица имеет четыре колонки, и строки в них либо заполнены, либо <NULL>
Если строка пустая, тогда заполнить ее такими же значениями как и в предыдущей строке.
Понимаю что ошибка где-то в алгоритме, но не могу понять где, так как нигде не смог найти очень описательного объяснения по последовательным курсорам, если кто даст ссылочку буду благодарен.
Прилагаю код:

Declare @client varchar(255),
    @region varchar(255),
    @city varchar(255),
    @okpo varchar(255),
    @client2 varchar(255)

Declare mycursor cursor forward_only for
select client,region,city,okpo,client
from venta
for update

open mycursor

FETCH NEXT FROM mycursor
INTO @client, @region,@city,@okpo,@client2

WHILE @@FETCH_STATUS=0
BEGIN        

    IF @client2 is NULL
    begin
    update venta set client=@client
    update venta set region=@region
    update venta set city=@city
    update venta set okpo=@okpo
    end
    ELSE
    begin
    set @client=1
    set @region=2
    set @city=3
    set @okpo=4
    end

FETCH NEXT FROM mycursor
INTO @client, @region, @city,@okpo,@client2

END
CLOSE mycursor
DEALLOCATE mycursor

Заранее приношу извинения за то что не смог оформить код согласно правилам, так как не нашел как его правильно оформить.
Таблица venta.Столбцы client,region,city,okpo. В данный момент код заменяет все поля значением <NULL>.
Заранее благодарен всем кто откликнется :)

Сообщение было отредактировано: 24 дек 09, 15:01
24 дек 09, 15:01    [8113711]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
так как нигде не смог найти очень описательного объяснения по последовательным курсорам


И какая, интересно, последовательность у Вашего курсора?

автор
тогда заполнить ее такими же значениями как и в предыдущей строке.


Говорить о предудущей\последующей строке можно только в отсортированном (и лучше по уникальному полю) набору.
24 дек 09, 15:17    [8113876]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
а зачем тут вообще курсор? почему нельзя сразу проапдейтить
24 дек 09, 15:30    [8114018]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
Dushelov
Member

Откуда:
Сообщений: 10
Последовательный он в том что FORWARD_ONLY - это последовательный курсор или intuit.ru врёт.
А насчет проапдейтить, подскажите пожалуйста как, ибо вручную тысячи строк будет очень долго. А данную операцию надо будет производить множество раз.
24 дек 09, 15:37    [8114100]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36803
Dushelov
Последовательный он в том что FORWARD_ONLY - это последовательный курсор или intuit.ru врёт.
А насчет проапдейтить, подскажите пожалуйста как, ибо вручную тысячи строк будет очень долго. А данную операцию надо будет производить множество раз.
А в справке написано, что A forward-only cursor does not support scrolling; it supports only fetching the rows serially from the start to the end of the cursor.
24 дек 09, 15:39    [8114116]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
у вас странный апдейт идёт по несортированному курсору по непонятному алгоритму.

берутся значения сущестсвующего первого попавшегося клиента и апдейтиться вся таблица этими данными и так в цикле. чего вы хотите этим добиться?
опишите вашу задачу, а не вашу реализацию
24 дек 09, 15:42    [8114146]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
Dushelov
Member

Откуда:
Сообщений: 10
Konst_One
у вас странный апдейт идёт по несортированному курсору по непонятному алгоритму.

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


Есть таблица venta. Столбцы client, region, city, okpo.
Строка либо заполнена и у всех столбцов есть значение, либо строка пустая по всем значениям.
Нужно чтобы если после заполненной строки идут пустые строки заполнить их данными с заполненной строки. Идти с самой верхней строки таблицы и до самого нижней. Первая строка заполнена.
24 дек 09, 15:55    [8114253]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
верх и низ - это что? я таких понятий не знаю и сервер SQL тоже. у вас есть какой-то PK в таблице или параметр сортировки записей указан?
24 дек 09, 15:57    [8114274]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Dushelov
Есть таблица venta. Столбцы client, region, city, okpo.
Строка либо заполнена и у всех столбцов есть значение, либо строка пустая по всем значениям.
Нужно чтобы если после заполненной строки идут пустые строки заполнить их данными с заполненной строки. Идти с самой верхней строки таблицы и до самого нижней. Первая строка заполнена.


У таблицы нет ни первой, ни верхней, ни нижней строки. Прежде чем браться за SQL необходимо освоить азы реляционной теории.
24 дек 09, 16:06    [8114349]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
aleks2
Guest
pkarklin
Dushelov
Есть таблица venta. Столбцы client, region, city, okpo.
Строка либо заполнена и у всех столбцов есть значение, либо строка пустая по всем значениям.
Нужно чтобы если после заполненной строки идут пустые строки заполнить их данными с заполненной строки. Идти с самой верхней строки таблицы и до самого нижней. Первая строка заполнена.


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


Дык тредстартеру усе по-барабану...

declare @venta table(client int, region int, city int, okpo int)
declare @client int, @region int, @city int, @okpo int

insert @venta
select 1,2,3,4
UNION ALL
select NULL,NULL,NULL,NULL
UNION ALL
select NULL,NULL,NULL,NULL
UNION ALL
select NULL,NULL,NULL,NULL
UNION ALL
select NULL,NULL,NULL,NULL
UNION ALL
select 10,20,30,40
UNION ALL
select NULL,NULL,NULL,NULL
UNION ALL
select NULL,NULL,NULL,NULL
UNION ALL
select NULL,NULL,NULL,NULL

-- было
select * FROM @venta

update @venta set 
 @client=ISNULL(client,@client)
,@region=ISNULL(region,@region)
,@city=ISNULL(city,@city)
,@okpo=ISNULL(okpo,@okpo)

,client=ISNULL(client, @client)
,region=ISNULL(region,@region)
,city=ISNULL(city,@city)
,okpo=ISNULL(okpo,@okpo)

-- стало
select * FROM @venta
Только так делать не надо.
24 дек 09, 16:14    [8114413]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
Dushelov
Member

Откуда:
Сообщений: 10
Всем спасибо, за то что рассказали мне какой я идиот!
Может кто-то всё таки поможет или подскажет по СУТИ вопроса?!
Собстветнно вопрос:
есть таблица формата:
---------------------------------
Клиент1|Регион1|Город1|Хрень1|
пусто |пусто |пусто |пусто |
пусто |пусто |пусто |пусто |
пусто |пусто |пусто |пусто |
Клиент2|Регион2|Город2|Хрень2|
пусто |пусто |пусто |пусто |
пусто |пусто |пусто |пусто |
Клиент3|Регион3|Город3|Хрень3|
пусто |пусто |пусто |пусто |
Клиент4|Регион4|Город4|Хрень4|
Клиент5|Регион5|Город5|Хрень5|
..............................................
КлиентN|РегионN|ГородN|ХреньN|
---------------------------------

должна получится таблица
---------------------------------
Клиент1|Регион1|Город1|Хрень1|
Клиент1|Регион1|Город1|Хрень1|
Клиент1|Регион1|Город1|Хрень1|
Клиент1|Регион1|Город1|Хрень1|
Клиент2|Регион2|Город2|Хрень2|
Клиент2|Регион2|Город2|Хрень2|
Клиент2|Регион2|Город2|Хрень2|
Клиент3|Регион3|Город3|Хрень3|
Клиент3|Регион3|Город3|Хрень3|
Клиент4|Регион4|Город4|Хрень4|
Клиент5|Регион5|Город5|Хрень5|
..............................................
КлиентN|РегионN|ГородN|ХреньN|
---------------------------------
Таблица может иметь тысячи данных.

Пожалуйста, тех кто может помочь мне изменением моего кода, или показать свой (желательно с объяснениями) ПОМОГИТЕ. Все кто напишет мне учить азы без ссылок, идите лесом. Извините, я мелкий нуб который самостоятельно на заданиях изчучает SQL чуть больше месяца, отнеситесь с пониманием, все когда-то были такими.
24 дек 09, 18:28    [8115478]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
Maxx
Member [скрыт]

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

а нафига размножать записи ??? чего пустые просто не грохнуть??? а выводом сортировки на клиента управлять через
select список полей from  таблица order by поле(я)
24 дек 09, 18:33    [8115493]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
Dushelov
Member

Откуда:
Сообщений: 10
Maxx
Dushelov,

а нафига размножать записи ??? чего пустые просто не грохнуть??? а выводом сортировки на клиента управлять через
select список полей from  таблица order by поле(я)


Maxx, просто на самом деле я не указал, думая что это неважно, что есть еще колоки 5,6,7 которые не пустые по всем полям.
24 дек 09, 18:47    [8115539]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ну как вас сказать))
смотрите - как определить что запись "следующая" ? Первичный ключ,или уникальный индекс -по етой таблице вообще есть ????? Есть хоть что-то общее для одинаковых записей в колонках 5,6 и 7 ??
-------------------------------------
Jedem Das Seine
24 дек 09, 18:53    [8115562]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
aleks2
Guest
Maxx
ну как вас сказать))
смотрите - как определить что запись "следующая" ? Первичный ключ,или уникальный индекс -по етой таблице вообще есть ????? Есть хоть что-то общее для одинаковых записей в колонках 5,6 и 7 ??
-------------------------------------
Jedem Das Seine


Зачем в этой "задаче" индекс? Один хрен сканировать таблицу.
... "порядок", канешна, определить бы стоило... ну да что там...

Dushelov
Всем спасибо, за то что рассказали мне какой я идиот!
Может кто-то всё таки поможет или подскажет по СУТИ вопроса?!

Пожалуйста, тех кто может помочь мне изменением моего кода, или показать свой (желательно с объяснениями) ПОМОГИТЕ. Все кто напишет мне учить азы без ссылок, идите лесом. Извините, я мелкий нуб который самостоятельно на заданиях изчучает SQL чуть больше месяца, отнеситесь с пониманием, все когда-то были такими.

Ну дык, я тебе привел РАБОТАЮЩИЙ пример. Аккурат то, шо ты хочешь.

Или тебе именно в курсор уперлось?
24 дек 09, 19:08    [8115608]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
Maxx
Member [скрыт]

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

просто пытаюсь понять что вообще надо..и попути задаю вопросы
пример рабочий не спорю...
24 дек 09, 19:14    [8115624]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
Dushelov
Member

Откуда:
Сообщений: 10
aleks2
Maxx
ну как вас сказать))
смотрите - как определить что запись "следующая" ? Первичный ключ,или уникальный индекс -по етой таблице вообще есть ????? Есть хоть что-то общее для одинаковых записей в колонках 5,6 и 7 ??
-------------------------------------
Jedem Das Seine


Зачем в этой "задаче" индекс? Один хрен сканировать таблицу.
... "порядок", канешна, определить бы стоило... ну да что там...

Dushelov
Всем спасибо, за то что рассказали мне какой я идиот!
Может кто-то всё таки поможет или подскажет по СУТИ вопроса?!

Пожалуйста, тех кто может помочь мне изменением моего кода, или показать свой (желательно с объяснениями) ПОМОГИТЕ. Все кто напишет мне учить азы без ссылок, идите лесом. Извините, я мелкий нуб который самостоятельно на заданиях изчучает SQL чуть больше месяца, отнеситесь с пониманием, все когда-то были такими.

Ну дык, я тебе привел РАБОТАЮЩИЙ пример. Аккурат то, шо ты хочешь.

Или тебе именно в курсор уперлось?


aleks2
Maxx
ну как вас сказать))
смотрите - как определить что запись "следующая" ? Первичный ключ,или уникальный индекс -по етой таблице вообще есть ????? Есть хоть что-то общее для одинаковых записей в колонках 5,6 и 7 ??
-------------------------------------
Jedem Das Seine


Зачем в этой "задаче" индекс? Один хрен сканировать таблицу.
... "порядок", канешна, определить бы стоило... ну да что там...

Dushelov
Всем спасибо, за то что рассказали мне какой я идиот!
Может кто-то всё таки поможет или подскажет по СУТИ вопроса?!

Пожалуйста, тех кто может помочь мне изменением моего кода, или показать свой (желательно с объяснениями) ПОМОГИТЕ. Все кто напишет мне учить азы без ссылок, идите лесом. Извините, я мелкий нуб который самостоятельно на заданиях изчучает SQL чуть больше месяца, отнеситесь с пониманием, все когда-то были такими.

Ну дык, я тебе привел РАБОТАЮЩИЙ пример. Аккурат то, шо ты хочешь.

Или тебе именно в курсор уперлось?


пример то конечно хороший. но когда я его исполняю а именно

declare @venta table(client int, region int, city int, okpo int)
declare @client int, @region int, @city int, @okpo int

update @venta set
@client=ISNULL(client,@client)
,@region=ISNULL(region,@region)
,@city=ISNULL(city,@city)
,@okpo=ISNULL(okpo,@okpo)

,client=ISNULL(client, @client)
,region=ISNULL(region,@region)
,city=ISNULL(city,@city)
,okpo=ISNULL(okpo,@okpo)

то

(0 row(s) affected)

В таблице ничего не меняется. Если это можно сделать без курсора то с удовольствием.
24 дек 09, 20:02    [8115723]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
Dushelov
Member

Откуда:
Сообщений: 10
извиняюсь за двойное цитирование. случайно
24 дек 09, 20:03    [8115724]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Dushelov
declare @venta table(client int, region int, city int, okpo int)
declare @client int, @region int, @city int, @okpo int

update @venta set
@client=ISNULL(client,@client)
,@region=ISNULL(region,@region)
,@city=ISNULL(city,@city)
,@okpo=ISNULL(okpo,@okpo)

,client=ISNULL(client, @client)
,region=ISNULL(region,@region)
,city=ISNULL(city,@city)
,okpo=ISNULL(okpo,@okpo)

то

(0 row(s) affected)

В таблице ничего не меняется. Если это можно сделать без курсора то с удовольствием.
Если апдейтить пустую табличную переменную,
то скорее состаришься или помрёшь, чем в ней хоть что-нибудь появится.
24 дек 09, 20:22    [8115762]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
Dushelov
Member

Откуда:
Сообщений: 10
iap
Dushelov
declare @venta table(client int, region int, city int, okpo int)
declare @client int, @region int, @city int, @okpo int

update @venta set
@client=ISNULL(client,@client)
,@region=ISNULL(region,@region)
,@city=ISNULL(city,@city)
,@okpo=ISNULL(okpo,@okpo)

,client=ISNULL(client, @client)
,region=ISNULL(region,@region)
,city=ISNULL(city,@city)
,okpo=ISNULL(okpo,@okpo)

то

(0 row(s) affected)

В таблице ничего не меняется. Если это можно сделать без курсора то с удовольствием.
Если апдейтить пустую табличную переменную,
то скорее состаришься или помрёшь, чем в ней хоть что-нибудь появится.


Так а как сделать чтоб подтягивало данные из таблицы. Потому как в описанном alek2 примере всё работает
24 дек 09, 20:44    [8115804]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
Dushelov
Member

Откуда:
Сообщений: 10
то есть как сделать для уже созданной таблицы?
24 дек 09, 21:14    [8115861]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
aleks2
Guest
Dushelov
aleks2
Maxx
ну как вас сказать))
смотрите - как определить что запись "следующая" ? Первичный ключ,или уникальный индекс -по етой таблице вообще есть ????? Есть хоть что-то общее для одинаковых записей в колонках 5,6 и 7 ??
-------------------------------------
Jedem Das Seine


Зачем в этой "задаче" индекс? Один хрен сканировать таблицу.
... "порядок", канешна, определить бы стоило... ну да что там...

Dushelov
Всем спасибо, за то что рассказали мне какой я идиот!
Может кто-то всё таки поможет или подскажет по СУТИ вопроса?!

Пожалуйста, тех кто может помочь мне изменением моего кода, или показать свой (желательно с объяснениями) ПОМОГИТЕ. Все кто напишет мне учить азы без ссылок, идите лесом. Извините, я мелкий нуб который самостоятельно на заданиях изчучает SQL чуть больше месяца, отнеситесь с пониманием, все когда-то были такими.

Ну дык, я тебе привел РАБОТАЮЩИЙ пример. Аккурат то, шо ты хочешь.

Или тебе именно в курсор уперлось?


aleks2
Maxx
ну как вас сказать))
смотрите - как определить что запись "следующая" ? Первичный ключ,или уникальный индекс -по етой таблице вообще есть ????? Есть хоть что-то общее для одинаковых записей в колонках 5,6 и 7 ??
-------------------------------------
Jedem Das Seine


Зачем в этой "задаче" индекс? Один хрен сканировать таблицу.
... "порядок", канешна, определить бы стоило... ну да что там...

Dushelov
Всем спасибо, за то что рассказали мне какой я идиот!
Может кто-то всё таки поможет или подскажет по СУТИ вопроса?!

Пожалуйста, тех кто может помочь мне изменением моего кода, или показать свой (желательно с объяснениями) ПОМОГИТЕ. Все кто напишет мне учить азы без ссылок, идите лесом. Извините, я мелкий нуб который самостоятельно на заданиях изчучает SQL чуть больше месяца, отнеситесь с пониманием, все когда-то были такими.

Ну дык, я тебе привел РАБОТАЮЩИЙ пример. Аккурат то, шо ты хочешь.

Или тебе именно в курсор уперлось?


пример то конечно хороший. но когда я его исполняю а именно

declare @venta table(client int, region int, city int, okpo int)
declare @client int, @region int, @city int, @okpo int

update @venta set
@client=ISNULL(client,@client)
,@region=ISNULL(region,@region)
,@city=ISNULL(city,@city)
,@okpo=ISNULL(okpo,@okpo)

,client=ISNULL(client, @client)
,region=ISNULL(region,@region)
,city=ISNULL(city,@city)
,okpo=ISNULL(okpo,@okpo)

то

(0 row(s) affected)

В таблице ничего не меняется. Если это можно сделать без курсора то с удовольствием.


Вестимо не меняется. Данные в таблицу за ваc Пушкин будет вносить?

Или уж запустите ВЕСЬ пример - вам полегчает...

до
1	2	3	4
NULL NULL NULL NULL
NULL NULL NULL NULL
NULL NULL NULL NULL
NULL NULL NULL NULL
10 20 30 40
NULL NULL NULL NULL
NULL NULL NULL NULL
NULL NULL NULL NULL

после
1	2	3	4
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
10 20 30 40
10 20 30 40
10 20 30 40
10 20 30 40
25 дек 09, 07:18    [8116455]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
aleks2
Guest
Dushelov
то есть как сделать для уже созданной таблицы?


Наверное стоит заменить @venta на dbo.venta?

И учиться T-SQL настоящим образом...
25 дек 09, 07:21    [8116459]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
Dushelov
Member

Откуда:
Сообщений: 10
aleks2
Dushelov
то есть как сделать для уже созданной таблицы?


Наверное стоит заменить @venta на dbo.venta?

И учиться T-SQL настоящим образом...


Простое огромное человеческое спасибо! Тему можно закрывать.
25 дек 09, 09:11    [8116681]     Ответить | Цитировать Сообщить модератору
 Re: проблема с курсором на заполнение данных  [new]
aleks2
Guest
Dushelov
aleks2
Dushelov
то есть как сделать для уже созданной таблицы?


Наверное стоит заменить @venta на dbo.venta?

И учиться T-SQL настоящим образом...


Простое огромное человеческое спасибо! Тему можно закрывать.


Хе-хе... все ишо только начинается!!! Ты ж, один хер, ничо не понял.

Завтра ты прибегёшь с вопросом: а чо оно работает в "неправильном" порядке.
25 дек 09, 09:13    [8116688]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить