Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Откуда вы узнали, что триггер именно не выполняется ? Вы как то мониторили его выполнение ? |
||
18 ноя 13, 10:40 [15146538] Ответить | Цитировать Сообщить модератору |
Jaffar Member Откуда: Сообщений: 633 |
Glory, row_number() over(order by ... asc) |
18 ноя 13, 10:47 [15146593] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Алексей Колодезный Member Откуда: Сообщений: 73 |
И за что вы так ненавидите SQL сервер. Зачем курсор засунули в такое интимное место? :) |
18 ноя 13, 11:01 [15146685] Ответить | Цитировать Сообщить модератору |
al.yugay Member Откуда: Сообщений: 26 |
Алексей Колодезный, а как по-другому? уже не знаю, как подступиться к этому триггеру....знаний не хватает. С чего начать, не знаю.. |
19 ноя 13, 07:24 [15152117] Ответить | Цитировать Сообщить модератору |
Алексей Колодезный Member Откуда: Сообщений: 73 |
Во первых, не стоит делать никаких предположений, что триггер будет вызываться 1 раз на одно посещение одного пациента. Первый, кто подорвется на этой мине, это будете вы, когда какой-нибудь скрипт над всей таблицей запустите. Во вторых, как выше уже предлагали, вместо курсоров лучше использовать ранжирующие функции (посмотрите описание ROW_NUMBER). Это правда если у вас MSSQL2005 или выше. Если MSSQL2000, то пронумеровать записи тоже можно путем нехитрых объединений с таблицей номеров с 1 до 100 например (думаю, что 100 болезней за раз даже у трупа не найдут :)) В третьих, наверно лучше эту затею выполнять не в триггере, а в хранимой процедуре, вызываемой с клиента при заведении этого посещения. В четвертых, не совсем понятно, зачем запоминать в БД номер диагноза по порядку, если они равнозначны. Если пользователю хочется лицезреть этот номер по порядку, то логичнее его сгенерировать тем-же ROW_NUMBER при выдачи данных на клиента. |
19 ноя 13, 08:20 [15152175] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
al.yugay Member Откуда: Сообщений: 26 |
-это надо у разработчиков спросить))) просто беда в том, что поле порядкового номера обязательно для заполнения. А еще есть уникальный индекс, состоящий из ИД посещения и порядкового номера диагноза. Именно на этот индекс и ругается программа. |
||
20 ноя 13, 11:52 [15160189] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
И как вы монитрите работу триггера то ? |
||
20 ноя 13, 11:58 [15160247] Ответить | Цитировать Сообщить модератору |
al.yugay Member Откуда: Сообщений: 26 |
Glory, ругаться будете)) компилирую триггер, иду в приложение, дальше смотрю - работает или нет |
20 ноя 13, 12:39 [15160715] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Круто. Откуда вы тогда знаете, что "триггер не работает" ? |
||
20 ноя 13, 12:45 [15160776] Ответить | Цитировать Сообщить модератору |
al.yugay Member Откуда: Сообщений: 26 |
Glory, запись не создается, выводится сообщение о том, что повторяется значение уникального индекса. |
20 ноя 13, 13:09 [15161038] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Т.е. вы даже прочитали сообщение об ошибке с номером строки кода, которая привела к ошибке ? |
||
20 ноя 13, 13:11 [15161054] Ответить | Цитировать Сообщить модератору |
al.yugay Member Откуда: Сообщений: 26 |
Glory, ошибку прочитала, номер строки тоже |
20 ноя 13, 13:12 [15161065] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Тогда что вам мешает исправить код в указанной строке так, чтобы он не генерировал ошибку ? |
||
20 ноя 13, 13:14 [15161073] Ответить | Цитировать Сообщить модератору |
al.yugay Member Откуда: Сообщений: 26 |
Glory, просто не получается. Не знаю уже, чтО писать.... |
20 ноя 13, 13:16 [15161097] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Интересно, а как у вас тогда получилось вообще что-то написать ? |
||
20 ноя 13, 13:17 [15161111] Ответить | Цитировать Сообщить модератору |
al.yugay Member Откуда: Сообщений: 26 |
Glory, издеваетесь? |
20 ноя 13, 13:20 [15161142] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Дык, глядя на ваши творения можно только плакать или смеяться. |
||
20 ноя 13, 13:23 [15161175] Ответить | Цитировать Сообщить модератору |
al.yugay Member Откуда: Сообщений: 26 |
aleks2,а можно подсказать, что исправить и где почитать, а не ерничать. |
20 ноя 13, 13:27 [15161220] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Вот что вам мешает создать временную таблицу для INSERTED и попробовать запускать свой код не в триггере, а в окне запроса студии ? |
||
20 ноя 13, 13:30 [15161245] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Вам надо _все_ читать. У вас явные проблемы с алгоритмом задачи. А вы почему то считаете, что вы просто не знаете какой-то волшебной опции какой-то команды. |
||
20 ноя 13, 13:31 [15161259] Ответить | Цитировать Сообщить модератору |
al.yugay Member Откуда: Сообщений: 26 |
Glory, посоветуйте, с чего начать. Хороший учебник, желательно с упражнениями. |
20 ноя 13, 13:33 [15161274] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
http://firststeps.ru/sql/sql1.html |
||
20 ноя 13, 13:34 [15161291] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |