2017-06-22 3 views
0

私は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 
+0

私はここで変更することを提案することが非常に多くあります。正直なところ私の考えではあなたの全体のアプローチは間違っています。可能な限りスカラー関数を避け、代わりにインラインテーブル値関数を使用したいとします。この場合、あなたはそれを行うことができます。しかし、あなたの機能はアイデンティティのDIY版です。これは並行性のような問題のために問題があります。自分のアイデンティティを常にロールアップすることは決してありません。代わりに、アイデンティティまたはシーケンスを使用してください。それでは、この関数はまったく必要ありません。 –

答えて

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 

そこで、基本的クエリの関数名をパラメータとして呼び出すと、その結果は値を持つ1つの行にすぎません。

変更した例では、関数呼び出しでselectの後にl.LocationIDを追加したので、これが必要なのかどうかはわかりませんが、必要に応じて変更してください。必要な正確な列がわからないので、他の問題がある場合はコメントを追加してください。

+0

Seanが上記の警告に注意してください。また、私は両方のタグが当時存在していたのでMySQLを想定していました。 –

+0

私はsql serverの構文が正しいため、sql serverと仮定しました。 :) –

+0

キーワード 'select'.'と '近くに不正な構文'の近くに'誤った構文が表示されます。 '' –

関連する問題