我試圖做一個簡單的更新語句在我的數據庫,如以下解決一些數據:將觸發器連接到該表時不能更新列值?
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