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