在触发器中检索数据

Retrieving data within a trigger

我创建了一个触发器,每当服务后设备的状态为 "purchase needed" 时发送邮件。在电子邮件中需要保修和购买日期,以及设备型号。我在触发器中有 3 个 select 语句。模型已检索,但日期不起作用且数据未保存。这是下面的触发器。如果我在消息中分开评论日期,一切正常

ALTER TRIGGER [dbo].[sendpurchaserequest]
   ON  [dbo].[services]
   AFTER INSERT
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    declare @type as varchar(50)
    declare @serial as varchar(50)
    declare @department as varchar(50)
    declare @action as varchar(150)
    declare @status as varchar(50)
    declare @message as Varchar(1000)
    declare @warrant as datetime
    declare @model as varchar(150)
    declare @purchase as varchar(20)

    SET NOCOUNT ON;

    -- Insert statements for trigger here
    set @type = (select Equipmenttype from inserted)
    set @action = (select supportaction from inserted)
    set @department = (select userdepartment from inserted)
    set @serial = (select serialnum from inserted)
    set @status = (select [status] from inserted)
    set @warrant = (select W_date from Equipment where Serial_no=@serial)
    set @model = (select Model from Equipment where Serial_no=@serial)
    set @purchase = (select P_date from Equipment where Serial_no=@serial)

    if @status = 'Purchase Needed     '
    begin
    set @message = 'Diagnostic tests on the following equipment have revealed that it is in need of replacement parts to be procured.

See details below:</br></br>' + 'Equipment Type:' + @type + '</br> Model: ' + @model +'</br> Serial Number: ' + @serial + '</br></br> User Department: ' + @department + '</br> Corrective Action: ' + @action + '</br> Purchase Date: ' + @purchase + '</br> Warrant Date: ' + @warrant

    print @message

                    EXECUTE msdb.dbo.sysmail_start_sp
                    EXEC msdb.dbo.sp_send_dbmail
                    @recipients='someone@site.com',
                    @body = @message,
                    @subject = 'Purchase Needed for Equipment',
                    @body_format ='HTML'

    end

你可以试试这个应该对每个删除的项目执行它 - 如果你想插入然后显然将它更改为插入 table 但你也应该插入:

ALTER TRIGGER [dbo].[sendpurchaserequest]
   ON  [dbo].[services]
   after insert
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    declare @type as varchar(50)
    declare @serial as varchar(50)
    declare @department as varchar(50)
    declare @action as varchar(150)
    declare @status as varchar(50)
    declare @message as Varchar(1000)
    declare @warrant as datetime
    declare @model as varchar(150)
    declare @purchase as datetime

    SET NOCOUNT ON;

    -- Insert statements for trigger here

    Declare email cursor fast_forward for
    Select i.Equipmenttype, i.supportaction, i.userdepartment, i.serialnum, i.[status], e.W_date, e.Model, e.P_date
    from inserted i
    inner join 
    Equipment e on e.Serial_no = i.serial

    Open email

    Fetch next from email into @type, @action, @department, @serial, @status, @warrant, @model, @purchase

    While @@FETCH_STATUS = 0
    begin

    if @status = 'Purchase Needed'
    begin
    set @message = 'Diagnostic tests on the following equipment have revealed that it is in need of replacement parts to be procured.

See details below:</br></br>' + 'Equipment Type:' + ISNULL(@type, '') + '</br> Model: ' + ISNULL(@model, '') +'</br> Serial Number: ' + ISNULL(@serial, '') + '</br></br> User Department: ' + ISNULL(@department, '') + '</br> Corrective Action: ' + ISNULL(@action, '') + '</br> Purchase Date: ' + ISNULL(Cast(@purchase as varchar),'') + '</br> Warrant Date: ' + ISNULL(Cast(@warrant as varchar), '')

    print @message

                    EXECUTE msdb.dbo.sysmail_start_sp
                    EXEC msdb.dbo.sp_send_dbmail
                    @recipients='someone@site.com',
                    @body = @message,
                    @subject = 'Purchase Needed for Equipment',
                    @body_format ='HTML'
    end
    Fetch next from email into @type, @action, @department, @serial, @status, @warrant, @model, @purchase
    end
End

顺便说一句,我还注意到你的@purchase 是 varchar(20) 你确定你的 P_date 是 varchar(20) 吗?如果不是,您需要将其转换为 this