查询执行时没有错误但不在触发器中

时间:2012-12-05 04:10:18

标签: sql sql-server-2008 triggers

我在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

1 个答案:

答案 0 :(得分: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