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

Откуда:
Сообщений: 19
Добрый день!
Триггер обновляет более 100 записей нормально и после этого обязательно один запись пропускает(не обновляет).
Помогите где не так написано.

	select  @dat=birth_day, @ID=id, @setNum=card_id from inserted 
	
	if @setNum is null
	begin
	select @personCount=PersonCount from P_PersonCard where PersonYear=year(@dat) and PersonMonth=month(@dat)
	if @personCount is null
	begin
	   insert into  P_PersonCard (PersonYear,PersonMonth,PersonCount) values  (year(@dat),month(@dat),1)
	   SET @personCount=0
	end
	else
	   update P_PersonCard Set PersonCount=@personCount+1 where PersonYear=year(@dat) and PersonMonth=month(@dat)
	set @num=cast(day(@dat) as nvarchar(2)) +  case  when  month(@dat) >9  then cast(month(@dat)as nvarchar(2))   else 
	  '0'+ cast(month(@dat)as nvarchar(2))  end  +  substring(cast(year(@dat) as nvarchar(4)),3,2) +cast((@personCount+1) as varchar(4))
	update  P_person  set card_id=@num where  ID=@ID
	end
24 фев 16, 12:08    [18856518]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация триггера  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
а если в inserted более 1й записи ?
24 фев 16, 12:10    [18856523]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация триггера  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
miru
Триггер обновляет более 100 записей нормально
Не рассказывайте нам сказки.
Что вы делаете, чтобы триггер что-либо "обновлял"?
В цикле что-то делаете с одной записью? Или что?
И, кстати, это неполный текст триггера.
24 фев 16, 12:16    [18856547]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация триггера  [new]
miru
Member

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

Это полный текст триггера и тут нету никакого сказок.
Цикле написано если пустое значение то добавляй если
есть значение то обновляй
24 фев 16, 12:23    [18856576]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация триггера  [new]
_djХомяГ
Guest
Не полный это текст - где сама clausa CREATE TRIGGER и что это за триггер и на какую таблицу
24 фев 16, 12:28    [18856594]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация триггера  [new]
miru
Member

Откуда:
Сообщений: 19
ALTER trigger [dbo].[P_trCard] on [dbo].[P_person] for insert as
		declare @num  int
		declare @dat datetime
		declare @ID uniqueidentifier 
		declare @personCount smallint
		declare @setNum  nvarchar(15)
		
	select  @dat=birth_day, @ID=id, @setNum=card_id from inserted 
	
	if @setNum is null
	begin
	select @personCount=PersonCount from P_PersonCard where PersonYear=year(@dat) and PersonMonth=month(@dat)
	if @personCount is null
	begin
	   insert into  P_PersonCard (PersonYear,PersonMonth,PersonCount) values  (year(@dat),month(@dat),1)
	   SET @personCount=0
	end
	else
	   update P_PersonCard Set PersonCount=@personCount+1 where PersonYear=year(@dat) and PersonMonth=month(@dat)
	set @num=cast(day(@dat) as nvarchar(2)) +  case  when  month(@dat) >9  then cast(month(@dat)as nvarchar(2))   else 
	  '0'+ cast(month(@dat)as nvarchar(2))  end  +  substring(cast(year(@dat) as nvarchar(4)),3,2) +cast((@personCount+1) as varchar(4))
	update  P_person  set card_id=@num where  ID=@ID
	end
24 фев 16, 12:32    [18856624]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация триггера  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
miru,

так на какой INSERT вызывается этот триггер, мы увидим?
Где гарантия, что всегда вставляется одна запись?
24 фев 16, 12:34    [18856642]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация триггера  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1837
miru,

у вас по хорошему триггер должен выглядеть как то так:
ALTER TRIGGER [dbo].[P_trCard] ON [dbo].[P_person] INSTEAD OF INSERT AS
        DECLARE
               @min_id INT,
               @max_id INT,
               @id INT,
               @card_id NVARCHAR(15),
               @birth_day DATETIME

        SELECT @min_id = ISNULL(MIN([ID]), 0),
               @max_id = ISNULL(MAX([ID]), 0)
        FROM INSERTED

        WHILE @min_id < @max_id BEGIN
             SELECT @birth_day = ISNULL([birth_day], '19000101'),
                    @card_id = ISNULL([card_id], '0'),
                    @id = [ID]
             FROM INSERTED
             WHERE [ID] = @min_id

             IF @card_id = '0'
                 MERGE INTO P_PersonCard AS target
                 USING (SELECT YEAR(@birth_day), MONTH(@birth_day)) AS source ([PersonYear], [PersonMonth])
                      ON source.[PersonYear] = target.[PersonYear]
                     AND source.[PersonMonth] = target.[PersonMonth]
                      WHEN MATCHED THEN UPDATE
                          SET PersonCount = target.[PersonCount] + 1
                      WHEN NOT MATCHED THEN
                          INSERT ([PersonYear], [PersonMonth], [PersonCount])
                            VALUES (source.[PersonYear], source.[PersonMonth], 1)
                 OUTPUT @id, @birth_day,  REPLACE(CONVERT(NVARCHAR(15), @birth_day, 3), '/', '') + CAST(INSERTED.PersonCount AS NVARCHAR(10)) INTO [P_Person] ([ID], [birth_day], [card_id]);
            ELSE
                INSERT INTO [P_Person] ([ID], [birth_day], [card_id]) VALUES (@id, @birth_day, @card_id)
 
        SELECT @min_id = MIN([ID]) FROM INSERTED WHERE [ID] > @min_id
        END


Если я конечно правильно понял логику того что у вас происходит с таблицами.
В любом случае если у вас с P_Persor вставка будет происходить из НАБОРА данных аля
INSERT INTO P_Person(id, birth_day, card_id)
  SELECT id, date, my_card FROM some_table

,то Ваш триггер будет работать некорректно поскольку вы присваиваете переменной рандомное значение из набора таблицы inserted

вам необходимо тогда 100% учитывать факт того что таких вот (как я выше написал) вставок не будет, а будут исключительно insert values()
24 фев 16, 13:24    [18856976]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация триггера  [new]
miru
Member

Откуда:
Сообщений: 19
felix_ff,
Спасибо за подсказку теперь все понятно.
24 фев 16, 14:19    [18857389]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить