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”。

因为您已别名tbFieldLabelsSourceFLS,但仍通过全名引用它。

使用上面显示的触发器,我可以运行它:

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

哪个成功并插入此记录:

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