Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查询执行时没有错误,但不在触发器中_Sql_Sql Server 2008_Triggers - Fatal编程技术网

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

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

在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

您的错误与所示的触发器代码不相关

鉴于这种结构:

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之间的
查询运行良好
——这是不可能的,因为插入的虚拟表不存在于触发器之外。用更多事实编辑你的问题。