1

私が取り組んでいるデータベースには、次の挿入トリガーがあります。問題は、トリガーが複数行の挿入で機能しないことです。一度に複数の行を挿入しようとすると、次のメッセージが表示されます。

メッセージ 512、レベル 16、状態 1、プロシージャ _ti_UD06、行 8 サブクエリ
が複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後にある場合、またはサブクエリが式として使用されている場合、これは許可されません。問題は、複数の行が挿入されたときに複数の値を返す次のステートメントにあると思います。

この挿入トリガーを複数の行で機能させるにはどうすればよいですか?

IF(SELECT PROGRESS_RECID FROM inserted) IS NULL 

PROGRESS_RECID表にはとの 2 つの列がありますPROGRESS_RECID_IDENT_

はSQL ServerPROGRESS_RECID_IDENT_の列だと思います。PROGRESS サーバーによって使用されますIdentityPROGRESS_RECID_INDENT

PROGRESS_RECID新しいレコードが挿入されると、トリガーは が nullかどうかを確認し、それをinserted.Identity

ALTER trigger [dbo].[_ti_UD06] ON [dbo].[UD06] for insert as
begin
if  ( select PROGRESS_RECID from inserted) is NULL
    begin
        update t set PROGRESS_RECID = i.IDENTITYCOL
        from UD06 t JOIN INSERTED i ON
        t.PROGRESS_RECID_IDENT_ = i.PROGRESS_RECID_IDENT_
        select convert (bigint, @@identity)
    end
end

これがテーブル定義です

CREATE TABLE [dbo].[UD06](
[Company] [nvarchar](8) NULL,
[Key1] [nvarchar](50) NOT NULL,
[Key2] [nvarchar](50) NULL,
[Key3] [nvarchar](50) NULL,
[Key5] [nvarchar](50) NULL,
[Character01] [nvarchar](max) NULL,
[Character02] [nvarchar](max) NULL,
[Character03] [nvarchar](max) NULL,
[Character04] [nvarchar](max) NULL,
[Character05] [nvarchar](max) NULL,
[Character06] [nvarchar](max) NULL,
[Character07] [nvarchar](max) NULL,
[Character08] [nvarchar](max) NULL,
[Character09] [nvarchar](max) NULL,
[Character10] [nvarchar](max) NULL,
[SysRowID] [nvarchar](36) NULL,
[SysRevID] [int] NULL,
[BitFlag] [int] NULL,
[GlobalUD06] [tinyint] NULL,
[GlobalLock] [tinyint] NULL,
[PROGRESS_RECID] [bigint] NULL,
[PROGRESS_RECID_IDENT_] [bigint] IDENTITY(1,1) NOT NULL
) ON [PRIMARY]
4

1 に答える 1

1

私はあなたがすでにかなり近づいていると思います:

ALTER trigger [dbo].[_ti_UD06] ON [dbo].[UD06] for insert as
begin

    UPDATE t 
    SET    PROGRESS_RECID = t.PROGRESS_RECID_IDENT_  --not "IDENTITYCOL"
    FROM   UD06 t 
    JOIN   inserted i ON  t.PROGRESS_RECID_IDENT_ = i.PROGRESS_RECID_IDENT_
    WHERE  i.PROGRESS_RECID is Null

    -- Not sure what this bit is for?  I doubt it's a good idea though...
    select convert (bigint, @@identity)

end
于 2013-04-28T21:45:51.467 に答える