Я пытался избежать использования курсора в этом конкретном случае только потому, что мне не нравятся компромиссы, и так получилось, что процесс, который я использую, в любом случае делает триггеры похожими на правильный курс действий.
Хранимая процедура вставляет запись на основе сложного сочетания предложений, используя триггер вставки, я отправляю электронное письмо целевому пользователю, предлагая ему посетить сайт. Это легко и работает нормально.
Однако другая процедура заключается в том, чтобы запускать каждую ночь и перераспределять все непросмотренные записи. То, как я это делал, заключалось в том, чтобы сделать еще одну вставку на основе выбора поля даты, когда оно было назначено. А именно:
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
inserted
и/илиdeleted
. Обычно это можно сделать, не прибегая к курсорам. Но нам нужно увидеть больше кода, чтобы посоветовать - все, что вы показали на данный момент, это стандартный оператор вставки. - person Damien_The_Unbeliever   schedule 27.04.2011