2015-02-10 56 views
0

我创建了一个触发器,用于在服务后设备状态为“需要购买”时发送邮件。在电子邮件中,需要保修和购买日期以及设备型号。我在触发器中有3个选择语句。检索模型,但日期不起作用,数据不会保存。下面是触发器。一切正常,如果我在邮件中除了评论日期检索触发器内的数据

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 [email protected]) 
    set @model = (select Model from Equipment where [email protected]) 
    set @purchase = (select P_date from Equipment where [email protected]) 

    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='[email protected]', 
        @body = @message, 
        @subject = 'Purchase Needed for Equipment', 
        @body_format ='HTML' 

    end 
+0

只是检查,但它是正确的W_Date被保存到日期时间字段,而P_date进入varchar(20)? – 2015-02-10 14:28:26

+0

对于'delete'触发器,'inserted'表应该是空的,所以这些分配大部分都是'null'。但是请注意,我也说'插入'*表*。即使您切换到使用“已删除”,您也需要认识到它可以包含0,1或*多行*。所有这些分配都被打破了,因为他们似乎认为触发表只包含一行 - 这是一个不合理的假设。 – 2015-02-10 14:35:13

+0

哪个dbms? (看起来不像ANSI SQL ...) – jarlh 2015-02-10 14:54:44

回答

0

你可以给这个应该履行它为每个已删除项目一试 - 如果你想插入的话,显然将其更改为插入表,但也是你的,而不是应该的被插入:

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='[email protected]', 
        @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)?如果没有,你需要把它作为这个

+0

我的购买和保修有datetime类型,但没有工作,所以我试着varchar。插入后触发器应该说 – user3590040 2015-02-10 15:50:18

+0

@ user3590040我已经修改了上述内容,现在应该可以使用 – 2015-02-10 16:00:58

+0

电子邮件已发送,但正文为空 – user3590040 2015-02-13 14:16:19