私はSQLに挿入した後に別のテーブルに挿入するトリガを作成しています。しかし、テーブルから値を取り出して、挿入に使用するインクリメントにする必要があります。トリガ内の関数を使用しているSQL
私はAirVisionSiteLogテーブルを持っています。テーブルに挿入すると、別のSiteLogテーブルに挿入することができます。しかし、これを行うにはSiteLogテーブルからサイトの最後のエントリ番号を取得する必要があります。それから、そのインサートでその結果を取り出し、新しいエントリー数を1つ増やします。私はトリガと関数が新ですので、それらを正しく使う方法がわかりません。私はエントリ番号を取得してインクリメントする機能を持っていると信じていますが、トリガでどのように使用するかはわかりません。
My機能 -
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
私はここで変更することを提案することが非常に多くあります。正直なところ私の考えではあなたの全体のアプローチは間違っています。可能な限りスカラー関数を避け、代わりにインラインテーブル値関数を使用したいとします。この場合、あなたはそれを行うことができます。しかし、あなたの機能はアイデンティティのDIY版です。これは並行性のような問題のために問題があります。自分のアイデンティティを常にロールアップすることは決してありません。代わりに、アイデンティティまたはシーケンスを使用してください。それでは、この関数はまったく必要ありません。 –