Sql 查询执行时没有错误,但不在触发器中
在MS SQL中创建触发器时,我面临一个奇怪的问题。 我有一个执行时没有错误的查询,但当我把它放在触发器体中时,它会给出错误 列名“ScreenName”无效 我把整个触发代码放在这里Sql 查询执行时没有错误,但不在触发器中,sql,sql-server-2008,triggers,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 t
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
您的错误与所示的触发器代码不相关 鉴于这种结构:
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”
因为您将tbfieldlabelsource
别名为FLS
,但仍通过全名引用它
使用上面显示的触发器,我可以运行以下操作:
insert tbFieldLabels select 4, 'zyx', 'def', null;
成功并插入此记录:
id screenname systemname textboxlength
----------- ---------- ---------- -------------
4 zyx def 67
谢谢你的回复。我不面对你提到的这个问题。我可能修改了它,但忘了使用别名。在这种情况下,会出现与您提到的相同的错误。但我面临着另一个问题。数据库拒绝存在where子句中的列。“AS”和“Go”中的查询运行正常,但当我运行整个触发器时。我导致错误“无效列名”ScreenName“如果您没有显示确切的代码,没有人可以帮助您。至于As和GO之间的
查询运行良好
——这是不可能的,因为插入的虚拟表不存在于触发器之外。用更多事实编辑你的问题。