SQL在触发器中使用函数

时间:2017-06-22 17:09:33

标签: sql-server function triggers

我在SQL中创建了一个触发器,它将在Insert上插入另一个表。但是,我需要从表中获取一个值以增加在插入中使用。

我有一张AirVisionSiteLog表。在表上插入我希望它插入另一个SiteLog表。但是,为了做到这一点,我需要从SiteLog表中获取站点的最后一个条目号。然后在其插入时获取该结果并将新条目号增加1。我是Triggers和Functions的新手,所以我不确定如何正确使用它们。我相信我有一个功能来检索和增加条目号,但我不知道如何在触发器中使用它。

我的功能 -

CREATE FUNCTION AQB_RMS.F_GetLogEntryNumber

(@LocationID int)

RETURNS INTEGER

AS 
BEGIN
    DECLARE
        @MaxEntry Integer,
        @EntryNumber Integer

 Set @MaxEntry = (Select Max(SL.EntryNumber) FROM AQB_MON.AQB_RMS.SiteLog SL
                WHERE SL.LocationID = @LocationID)

 SET @EntryNumber = @MaxEntry + 1

 RETURN @EntryNumber

 END 

我的触发并尝试使用功能 -

 CREATE TRIGGER [AQB_RMS].[SiteLogCreate] on [AQB_MON].[AQB_RMS].[AirVisionSiteLog]
 AFTER INSERT
 AS
 BEGIN

declare @entrynumber int
declare @corrected int

set @corrected = 0

INSERT INTO [AQB_MON].[AQB_RMS].[SiteLog]
        ([SiteLogTypeID],[LocationID],[EntryNumber],[SiteLogEntry]
       ,[EntryDate],[Corrected],[DATE_CREATED],[CREATED_BY])

SELECT st.SiteLogTypeID, l.LocationID, 
 (select AQB_RMS.F_GetLogEntryNumber from [AQB_MON].[AQB_RMS].[SiteLog] sl 
 where sl.LocationID = l.LocationID)
 , i.SiteLogEntry, i.EntryDate, @corrected, i.DATE_CREATED, i.CREATED_BY

from inserted i
left join AQB_MON.[AQB_RMS].[SiteLogType] st on st.SiteLogType = i.SiteLogType
left join AQB_MON.AQB_RMS.Location l on l.SourceSiteID = i.SourceSiteID

 END 

 GO

1 个答案:

答案 0 :(得分:0)

我相信你很亲密。

在触发器中查询的这一部分:(我垂直设置列以使差异更明显)

SELECT st.SiteLogTypeID, 
       l.LocationID,
       (select AQB_RMS.F_GetLogEntryNumber from [AQB_MON].[AQB_RMS].[SiteLog] sl where sl.LocationID = l.LocationID),
       i.SiteLogEntry,
       i.EntryDate,
       @corrected,
       i.DATE_CREATED,
       i.CREATED_BY

......应该是:

SELECT st.SiteLogTypeID,
       l.LocationID, 
       AQB_RMS.F_GetLogEntryNumber(select l.LocationID from [AQB_MON].[AQB_RMS].[SiteLog] sl where sl.LocationID = l.LocationID),
       i.SiteLogEntry,
       i.EntryDate,
       @corrected,
       i.DATE_CREATED,
       i.CREATED_BY

基本上,您可以使用查询作为参数调用函数名称,其结果应该只是带有值的一行。

请注意,在我的修改示例中,我在函数调用中的select之后添加了l.LocationID,因此我不确定这是否是您需要的,但更改它以满足您的需要。因为我不确定您需要的确切列,如果存在其他问题,请添加注释。