0

MS SQL でトリガーを作成する際に奇妙な問題に直面しています。エラーなしで実行されるクエリがありますが、トリガー本体内に配置するとエラーが発生します

列名 'ScreenName' が無効です。

ここにトリガーコード全体を配置しています。

CREATE TRIGGER [dbo].[tr_tbFieldLabels_FieldLabelLength] ON [dbo].[tbFieldLabels]
AFTER INSERT
AS
    Update tbFieldLabels 
    Set TextBoxLength = (SELECT top 1 TextboxLength 
                              FROM  tbFieldLabelsSource FLS
                              WHERE FLS.ScreenName = Inserted.ScreenName
                              AND  FLS.SystemName = Inserted.SystemName)
     FROM tbFieldLabels , Inserted WHERE tbFieldLabels.ID = Inserted.ID
GO
4

1 に答える 1

1

エラーは、表示されているトリガー コードと相関していません。

この構造を考えると:

create table tbFieldLabels (id int, screenname varchar(10), systemname varchar(10), textboxlength int);
create table tbFieldLabelsSource (screenname varchar(10), systemname varchar(10), textboxlength int);
insert tbFieldLabelsSource select 'abc', 'def', 99;
insert tbFieldLabelsSource select 'zyx', 'def', 67;
GO

次のトリガーを正常に作成できます。

CREATE TRIGGER [dbo].[tr_tbFieldLabels_FieldLabelLength] ON [dbo].[tbFieldLabels]
AFTER INSERT
AS
    Update tbFieldLabels 
    Set TextBoxLength = (SELECT top 1 TextboxLength 
                              FROM  tbFieldLabelsSource FLS
                              WHERE FLS.ScreenName = Inserted.ScreenName
                              AND  FLS.SystemName = Inserted.SystemName)
     FROM tbFieldLabels , Inserted WHERE tbFieldLabels.ID = Inserted.ID
GO

質問のコードは失敗したでしょう

マルチパート識別子「tbFieldLabelsSource.SystemName」をバインドできませんでした。

tbFieldLabelsSourceとしてエイリアスをFLS付けたが、まだフルネームで参照しているためです。

上記のトリガーを使用して、これを実行できます。

insert tbFieldLabels select 4, 'zyx', 'def', null;

どちらが成功し、次のレコードが挿入されます:

id          screenname systemname textboxlength
----------- ---------- ---------- -------------
4           zyx        def        67
于 2012-12-05T05:01:48.840 に答える