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

Откуда:
Сообщений: 26
Здравствуйте!
Написала триггер, который считает сколько в прошлый раз было поставлено диагнозов определенному пациенту. Потом отбирает последние диагнозы (строки из таблицы DATA_DIAGNOSIS) и вставляет в эту же таблицу. Только меняется ИД посещения к врачу (поле MOTCONSU_ID).
Таблица DATA_DIAGNOSIS имеет поле N_LINE - оно предназначено для нумерации диагноза в рамках посещения. Например, если, было поставлено 3 диагноза, то в трех строках значение этого поля будут 1, 2 и 3 соответственно.
Сам триггер:
BEGIN
 declare 
 @dataid int,
 @pat_id int,
 @mot_id int,
 @m_id int,
 @tip_ds int,
 @vid_diagnosa int,
 @mkb int,
 @n int,
 @i int,
 @n_line int

set @pat_id=(select patients_id from INSERTED)
set @mot_id=(select motconsu_id from INSERTED)
set @m_id=(select max(d.motconsu_id) from DATA_DIAGNOSIS d
           join inserted as i
           on d.patients_id=i.patients_id
           join motconsu as m
           on m.patients_id=i.patients_id          
           where m.models_id=326)
set @n=(select count(*) from data_diagnosis where motconsu_id=@m_id)

if EXISTS
(select * from motconsu m
join inserted as i
on m.patients_id=i.patients_id
where i.models_id=326)
AND
exists (select * from data_diagnosis d
join inserted as i
on d.patients_id=i.patients_id)
BEGIN
select @i=1 
while @i<@n
  BEGIN  
  declare diagnoz cursor for
  select patients_id, tip_diagnoza, n_line
  from data_diagnosis
  where motconsu_id=@m_id
  open diagnoz
  fetch next from diagnoz into @pat_id, @tip_ds, @n_line
  while @@fetch_status=0
     BEGIN
     set @n_line=1
     EXEC up_get_id 'DATA_DIAGNOSIS', 1, @dataid OUTPUT     
     insert into data_diagnosis (patients_id, motconsu_id, data22_id, n_line, 
     tip_diagnoza) values (@pat_id, @mot_id, @dataid, @n_line, @tip_ds)
     set @n_line=@n_line+1
     fetch next from diagnoz into @pat_id, @tip_ds, @n_line  
     END
     
  close diagnoz
  deallocate diagnoz   
  END
  
 END
END

Триггер не выполняется, подскажите, как правильно генерировать значение поля N_LINE так, чтобы при вставке в каждую строку значение этого поля увеличивается на 1 того количества, сколько было подсчитано записей в триггере.
Заранее спасибо!
18 ноя 13, 09:13    [15146185]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
Glory
Member

Откуда:
Сообщений: 104751
al.yugay
Триггер не выполняется,

Откуда вы узнали, что триггер именно не выполняется ? Вы как то мониторили его выполнение ?
18 ноя 13, 10:40    [15146538]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
Jaffar
Member

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

row_number() over(order by ... asc)
18 ноя 13, 10:47    [15146593]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
aleks2
Guest
fetch next from diagnoz into @pat_id, @tip_ds, @n_line
  while @@fetch_status=0
     BEGIN
     set @n_line=1
     EXEC up_get_id 'DATA_DIAGNOSIS', 1, @dataid OUTPUT     
     insert into data_diagnosis (patients_id, motconsu_id, data22_id, n_line, 
     tip_diagnoza) values (@pat_id, @mot_id, @dataid, @n_line, @tip_ds)
     set @n_line=@n_line+1
     fetch next from diagnoz into @pat_id, @tip_ds, @n_line  
     END


fetch next from diagnoz into @pat_id, @tip_ds, @n_line
   set @n_line=1
  while @@fetch_status=0
     BEGIN
     EXEC up_get_id 'DATA_DIAGNOSIS', 1, @dataid OUTPUT     
     insert into data_diagnosis (patients_id, motconsu_id, data22_id, n_line, 
     tip_diagnoza) values (@pat_id, @mot_id, @dataid, @n_line, @tip_ds)
     set @n_line=@n_line+1
     fetch next from diagnoz into @pat_id, @tip_ds, @n_line  
     END
18 ноя 13, 10:51    [15146621]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
Алексей Колодезный
Member

Откуда:
Сообщений: 73
И за что вы так ненавидите SQL сервер. Зачем курсор засунули в такое интимное место? :)
18 ноя 13, 11:01    [15146685]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
al.yugay
Member

Откуда:
Сообщений: 26
Алексей Колодезный,
а как по-другому? уже не знаю, как подступиться к этому триггеру....знаний не хватает. С чего начать, не знаю..
19 ноя 13, 07:24    [15152117]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
Алексей Колодезный
Member

Откуда:
Сообщений: 73
Во первых, не стоит делать никаких предположений, что триггер будет вызываться 1 раз на одно посещение одного пациента. Первый, кто подорвется на этой мине, это будете вы, когда какой-нибудь скрипт над всей таблицей запустите.

Во вторых, как выше уже предлагали, вместо курсоров лучше использовать ранжирующие функции (посмотрите описание ROW_NUMBER). Это правда если у вас MSSQL2005 или выше. Если MSSQL2000, то пронумеровать записи тоже можно путем нехитрых объединений с таблицей номеров с 1 до 100 например (думаю, что 100 болезней за раз даже у трупа не найдут :))

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

В четвертых, не совсем понятно, зачем запоминать в БД номер диагноза по порядку, если они равнозначны. Если пользователю хочется лицезреть этот номер по порядку, то логичнее его сгенерировать тем-же ROW_NUMBER при выдачи данных на клиента.
19 ноя 13, 08:20    [15152175]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
al.yugay
Member

Откуда:
Сообщений: 26
Алексей Колодезный,
BEGIN
 declare 
 @dataid int,
 @pat_id int,
 @mot_id int,
 @m_id int,
 @tip_ds int,
 @vid_diagnosa int,
 @mkb int,
 @n int,
 @i int,
 @n_line int

set @m_id=(select max(d.motconsu_id) from DATA_DIAGNOSIS d
           join inserted as i
           on d.patients_id=i.patients_id
           join motconsu as m
           on m.patients_id=i.patients_id          
           where m.models_id=326)
set @n=(select count(*) from data_diagnosis where motconsu_id=@m_id)

if EXISTS
(select * from motconsu m
join inserted as i
on m.patients_id=i.patients_id
where i.models_id=326)
AND
exists (select * from data_diagnosis d
join inserted as i
on d.patients_id=i.patients_id)
BEGIN
select @i=1 
while @i<@n
  BEGIN  
  declare diagnoz cursor for
  select ROW_NUMBER() over (order by n_line desc) As Row, tip_diagnoza
  from data_diagnosis
  where motconsu_id=@m_id
  open diagnoz
  fetch next from diagnoz into @n_line, @tip_ds
  while @@fetch_status=0
     BEGIN
   
     set @pat_id=(select patients_id from INSERTED)
     set @mot_id=(select motconsu_id from INSERTED)   
     EXEC up_get_id 'DATA_DIAGNOSIS', 1, @dataid OUTPUT     
     insert into data_diagnosis (patients_id, motconsu_id, data22_id, n_line, 
     tip_diagnoza) values (@pat_id, @mot_id, @dataid, @n_line, @tip_ds)
    
     fetch next from diagnoz into @n_line, @tip_ds  
     END
     
  close diagnoz
  deallocate diagnoz   
  END
  
 END
END

Написала так. Теперь триггер не работает. Значения не копируются
20 ноя 13, 11:46    [15160125]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
al.yugay
Member

Откуда:
Сообщений: 26
Алексей Колодезный
Во первых, не стоит делать никаких предположений, что триггер будет вызываться 1 раз на одно посещение одного пациента. Первый, кто подорвется на этой мине, это будете вы, когда какой-нибудь скрипт над всей таблицей запустите. - не совсем поняла, к чему это. Вроде должно работать на других пациентах...

Во вторых, как выше уже предлагали, вместо курсоров лучше использовать ранжирующие функции (посмотрите описание ROW_NUMBER). Это правда если у вас MSSQL2005 или выше. Если MSSQL2000, то пронумеровать записи тоже можно путем нехитрых объединений с таблицей номеров с 1 до 100 например (думаю, что 100 болезней за раз даже у трупа не найдут :)) - а можно поподробнее?

В третьих, наверно лучше эту затею выполнять не в триггере, а в хранимой процедуре, вызываемой с клиента при заведении этого посещения. - знать бы еще как настроить запуск этой процедуры на SQL сервере. Знаю только, как в триггере.
EXEC <название процедуры>+перечисление параметров запуска


В четвертых, не совсем понятно, зачем запоминать в БД номер диагноза по порядку, если они равнозначны. Если пользователю хочется лицезреть этот номер по порядку, то логичнее его сгенерировать тем-же ROW_NUMBER при выдачи данных на клиента.

-это надо у разработчиков спросить))) просто беда в том, что поле порядкового номера обязательно для заполнения.
А еще есть уникальный индекс, состоящий из ИД посещения и порядкового номера диагноза.


Именно на этот индекс и ругается программа.
20 ноя 13, 11:52    [15160189]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
Glory
Member

Откуда:
Сообщений: 104751
al.yugay
Написала так. Теперь триггер не работает. Значения не копируются

И как вы монитрите работу триггера то ?
20 ноя 13, 11:58    [15160247]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
al.yugay
Member

Откуда:
Сообщений: 26
Glory, ругаться будете)) компилирую триггер, иду в приложение, дальше смотрю - работает или нет
20 ноя 13, 12:39    [15160715]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
Glory
Member

Откуда:
Сообщений: 104751
al.yugay
, иду в приложение, дальше смотрю - работает или нет

Круто.
Откуда вы тогда знаете, что "триггер не работает" ?
20 ноя 13, 12:45    [15160776]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
al.yugay
Member

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

запись не создается, выводится сообщение о том, что повторяется значение уникального индекса.
20 ноя 13, 13:09    [15161038]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
Glory
Member

Откуда:
Сообщений: 104751
al.yugay
выводится сообщение о том, что повторяется значение уникального индекса.

Т.е. вы даже прочитали сообщение об ошибке с номером строки кода, которая привела к ошибке ?
20 ноя 13, 13:11    [15161054]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
al.yugay
Member

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

ошибку прочитала, номер строки тоже
20 ноя 13, 13:12    [15161065]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
Glory
Member

Откуда:
Сообщений: 104751
al.yugay
ошибку прочитала, номер строки тоже

Тогда что вам мешает исправить код в указанной строке так, чтобы он не генерировал ошибку ?
20 ноя 13, 13:14    [15161073]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
al.yugay
Member

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

просто не получается. Не знаю уже, чтО писать....
20 ноя 13, 13:16    [15161097]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
Glory
Member

Откуда:
Сообщений: 104751
al.yugay
просто не получается.

Интересно, а как у вас тогда получилось вообще что-то написать ?
20 ноя 13, 13:17    [15161111]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
al.yugay
Member

Откуда:
Сообщений: 26
Glory, издеваетесь?
20 ноя 13, 13:20    [15161142]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
aleks2
Guest
al.yugay
Glory, издеваетесь?

Дык, глядя на ваши творения можно только плакать или смеяться.
20 ноя 13, 13:23    [15161175]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
al.yugay
Member

Откуда:
Сообщений: 26
aleks2,а можно подсказать, что исправить и где почитать, а не ерничать.
20 ноя 13, 13:27    [15161220]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
Glory
Member

Откуда:
Сообщений: 104751
al.yugay
Glory, издеваетесь?

Вот что вам мешает создать временную таблицу для INSERTED и попробовать запускать свой код не в триггере, а в окне запроса студии ?
20 ноя 13, 13:30    [15161245]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
Glory
Member

Откуда:
Сообщений: 104751
al.yugay
а можно подсказать, что исправить и где почитать, а не ерничать.

Вам надо _все_ читать.
У вас явные проблемы с алгоритмом задачи. А вы почему то считаете, что вы просто не знаете какой-то волшебной опции какой-то команды.
20 ноя 13, 13:31    [15161259]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
al.yugay
Member

Откуда:
Сообщений: 26
Glory, посоветуйте, с чего начать. Хороший учебник, желательно с упражнениями.
20 ноя 13, 13:33    [15161274]     Ответить | Цитировать Сообщить модератору
 Re: Вставка в таблицу поля, которое увеличивается на 1, в курсоре  [new]
Glory
Member

Откуда:
Сообщений: 104751
al.yugay
Хороший учебник, желательно с упражнениями.

http://firststeps.ru/sql/sql1.html
20 ноя 13, 13:34    [15161291]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить