我正在尝试使用简单的Update语句来修复数据库中的某些数据,如下所示:
UPDATE SalesTable
SET ProductId = NULL
WHERE ProductId = 0
我只想将0的任何值切换回null。该列可以为空,并且已经存在一些空记录。问题似乎是我有一个附加到SalesTable的触发器,当对该表进行更新时会触发该触发器。它似乎不喜欢我的update语句一次更新多行的事实。我该如何解决这个问题?
如果有帮助,这是错误消息:
子查询返回的值超过1。当子查询跟在=, !=, <, <= , >, >=
之后或子查询用作表达式时,不允许这样做。
这是触发器的一个愚蠢的版本。不确定它是否重要,但触发器中没有使用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
答案 0 :(得分:1)
感谢xQbert在我的问题下留下评论,解决了我的问题而无需重写我的触发器。他的解决方案是禁用触发器,进行更新,然后在更新后重新启用触发器。由于我运行更新时系统将关闭,因此可以正常工作。但是,如果在实时系统中遇到相同的问题,那么在执行此操作时也应该锁定表。
ALTER TABLE SalesTable DISABLE TRIGGER SalesTrigger
UPDATE SalesTable
SET ProductId = NULL
WHERE ProductId = 0
ALTER TABLE SalesTable ENABLE TRIGGER SalesTrigger
答案 1 :(得分:0)
在您的触发器中,您可能会遇到以下情况:
where ProductID = (Select ProductId From SalesTable)
看看你是否可以将其改为
where ProductID IN (Select ProductId From SalesTable)
是的触发器文本在这里是相关的。
答案 2 :(得分:0)
-- Here's your problem
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
以@salesId为例 - 更新一条记录(比如salesId 1)时,@salesId已从插入的
中正确分配但是,当一次更新多行时,比如说1,2,3,4,5,整个@salesId不能将行数据作为其赋值。
我认为你可以通过循环运行update语句来解决这个问题,一次做一行。但真正的解决方案是更新触发器。我相信我们可以提供一些有关如何操作的建议 - 尽管您声明无法更新触发器。