Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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 Server触发器中的列名无效_Sql_Sql Server_Triggers - Fatal编程技术网

SQL Server触发器中的列名无效

SQL Server触发器中的列名无效,sql,sql-server,triggers,Sql,Sql Server,Triggers,如果取消预订,我有以下代码从表中删除信息,但我收到以下错误: Msg 207,16级,状态1,程序trgDelBooking,第10行 无效的列名“BookingStatus” 但是,列名绝对正确 这是我的密码: ALTER TRIGGER trgDelBooking ON HVCBookings AFTER UPDATE AS BEGIN SELECT * FROM Inserted DELETE FROM HVCActivityBooking WHERE

如果取消预订,我有以下代码从表中删除信息,但我收到以下错误:

Msg 207,16级,状态1,程序trgDelBooking,第10行 无效的列名“BookingStatus”

但是,列名绝对正确

这是我的密码:

ALTER TRIGGER trgDelBooking
ON HVCBookings
AFTER UPDATE
AS
BEGIN
    SELECT * 
    FROM Inserted

    DELETE FROM HVCActivityBooking
    WHERE PartyID = (SELECT PartyID FROM inserted)
      AND BookingStatus = 'CANCELLED'
END
GO

有什么建议吗?

除了列名的问题外,您的触发器假定inserted只有一行。这是一个非常糟糕的假设。查询应为:

DELETE FROM HVCActivityBooking
WHERE PartyID IN (SELECT PartyID FROM inserted) AND
      BookingStatus = 'CANCELLED';
当然,这并不能解决未知列的问题。这只会让扳机更安全

编辑:如果BookingStatus位于HVCBookings中,则可以在子查询中设置WHERE条件:

DELETE FROM HVCActivityBooking
WHERE PartyID IN (SELECT i.PartyID FROM inserted i WHERE i.BookingStatus = 'CANCELLED');

除了列名的问题外,触发器还假设inserted只有一行。这是一个非常糟糕的假设。查询应为:

DELETE FROM HVCActivityBooking
WHERE PartyID IN (SELECT PartyID FROM inserted) AND
      BookingStatus = 'CANCELLED';
当然,这并不能解决未知列的问题。这只会让扳机更安全

编辑:如果BookingStatus位于HVCBookings中,则可以在子查询中设置WHERE条件:

DELETE FROM HVCActivityBooking
WHERE PartyID IN (SELECT i.PartyID FROM inserted i WHERE i.BookingStatus = 'CANCELLED');

我相信数据库:HVCActivityBooking.BookingStatus不存在。请同时提供表结构。您的触发器有一个主要缺陷,您似乎认为它每行调用一次-事实并非如此。每个语句将触发一次触发器,所以如果您的语句更新25行,则将触发一次触发器,但插入的伪表将包含25行。您的代码将在此处选择这25行中的哪一行??从inserted中选择PartyID-这是不确定的,您将得到一个任意行,并将忽略所有其他行。你需要重写你的触发器来考虑这一点@marc_s:我同意您的评估,但是如果insert有多行,它不会给子查询返回的值带来多个错误吗?我不希望触发器中的查询与触发器外的查询有不同的工作方式。@BenThul:是的,可能-你在这个问题上是对的。整个触发器本身就是有缺陷的。我相信数据库HVCActivityBooking.BookingStatus不存在。请同时提供表结构。您的触发器有一个主要缺陷,您似乎认为它每行调用一次-事实并非如此。每个语句将触发一次触发器,所以如果您的语句更新25行,则将触发一次触发器,但插入的伪表将包含25行。您的代码将在此处选择这25行中的哪一行??从inserted中选择PartyID-这是不确定的,您将得到一个任意行,并将忽略所有其他行。你需要重写你的触发器来考虑这一点@marc_s:我同意您的评估,但是如果insert有多行,它不会给子查询返回的值带来多个错误吗?我不希望触发器中的查询与触发器外的查询有不同的工作方式。@BenThul:是的,可能-你在这个问题上是对的。整个触发器都有缺陷,谢谢你。我将条件从DELETE查询移动到SELECT as BookingStatus在HVCBookings中,而不是你提到的HVCActivityBookings,新手错误。再次感谢汉克斯。我将条件从DELETE查询移动到SELECT as BookingStatus在HVCBookings中,而不是你提到的HVCActivityBookings,新手错误。再次感谢