我试图做一个简单的更新语句在我的数据库,如以下解决一些数据:将触发器连接到该表时不能更新列值?
UPDATE SalesTable
SET ProductId = NULL
WHERE ProductId = 0
我只是想为0的任何值切换回空。该列可以为空,并且已经有一些空记录。问题似乎是我有一个附加到SalesTable的触发器,当对该表进行更新时触发。它似乎并不喜欢我的更新语句一次更新多行。我如何解决这个问题?
以下是错误消息是否有帮助:
子查询返回多个值。当子查询遵循=, !=, <, <= , >, >=
或子查询用作表达式时,这是不允许的。
这是触发器的一个虚拟版本。不确定是否重要,但ProductId字段未在触发器中使用。
DECLARE @salesId int
DECLARE @salesDate DateTime2
DECLARE @customerName varchar(50)
SELECT @salesId = s.SalesId,
@salesDate = s.SalesDate,
@customerName = c.CustomerName
FROM Inserted s
INNER JOIN Customer c
ON s.CustomerId = c.CustomerId
UPDATE SalesSummary
SET SalesId = @salesId,
SalesDate = @salesDate,
CustomerName = @customerName
WHERE SalesId = @salesId
触发文本与此处相关。更新的行数不相关,因为更新的每一行都会触发触发器。问题是我认为在触发器本身,因为在触发器内的子查询没有返回一个唯一的记录。我们需要查看触发器更新部分中的文本。 – xQbert 2014-10-02 18:01:06
我编辑了我的帖子,添加了触发代码的哑版。你是对的,似乎问题是我从“插入”和“插入”的数据是多个记录导致它失败。由于管理原因,我无法更改触发器,所以我试图提出一个Update语句来绕过此限制。我知道我可以做一个光标并循环遍历每个记录并单独更新,但必须有一个更好/更简单的方法,对吧? – user3653673 2014-10-02 18:09:39
您的触发器代码在这里似乎有一个主要缺陷。你的代码不会处理多行操作。在触发器中设置基于代码是至关重要的。当你有这样的标量值时,你不能准确地处理它。 – 2014-10-02 18:17:44