Я пытался избежать использования курсора в этом конкретный случай только потому, что мне не нравятся компромиссы, и так уж получилось, что процесс, который я использую, в любом случае заставляет триггеры выглядеть правильным курсом действий.
Хранимая процедура вставляет запись, основанную на сложном сочетании предложений, используя триггер вставки Я отправляю целевому пользователю электронное письмо с предложением посетить сайт. Это просто и прекрасно работает.
Однако другая процедура - запускать каждую ночь и перераспределять все непросмотренные записи. То, как я это делал, заключалось в том, чтобы сделать еще одну вставку на основе выбора в поле даты, когда оно было назначено. То есть:
INSERT INTO Table (ID, User, AssignDate, LastActionDate)
SELECT
ID
,User
,GETDATE() [AssignDate]
,GETDATE() [LastModifiedDate]
FROM Table2
/*snip*/
Триггер работает с отдельными вставками, но оператор select выше работает только с последней вставленной строкой. Есть ли способ обойти такое поведение? Это все разрушает!
Правка (код триггера):
ALTER TRIGGER dbo.Notify
ON dbo.Table
AFTER INSERT
AS
BEGIN
DECLARE @EmailSender varchar(50)='Sender Profile'
DECLARE @Identity int
DECLARE @User varchar(20)
DECLARE @Subject varchar(50)
SET @Identity=@@Identity
SELECT @User=User, @Subject='(' + CONVERT(varchar,@Identity) + ')!'
FROM Table
WHERE
idNum=@Identity
exec msdb.dbo.sp_send_dbmail
@profile_name=@EmailSender,
@recipients=@User
@subject=@Subject,
@body='//etc'
END