2014-10-02 59 views
0

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

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 
+1

觸發文本與此處相關。更新的行數不相關,因爲更新的每一行都會觸發觸發器。問題是我認爲在觸發器本身,因爲在觸發器內的子查詢沒有返回一個唯一的記錄。我們需要查看觸發器更新部分中的文本。 – xQbert 2014-10-02 18:01:06

+0

我編輯了我的帖子,添加了觸發代碼的啞版。你是對的,似乎問題是我從「插入」和「插入」的數據是多個記錄導致它失敗。由於管理原因,我無法更改觸發器,所以我試圖提出一個Update語句來繞過此限制。我知道我可以做一個光標並循環遍歷每個記錄並單獨更新,但必須有一個更好/更簡單的方法,對吧? – user3653673 2014-10-02 18:09:39

+0

您的觸發器代碼在這裏似乎有一個主要缺陷。你的代碼不會處理多行操作。在觸發器中設置基於代碼是至關重要的。當你有這樣的標量值時,你不能準確地處理它。 – 2014-10-02 18:17:44

回答

0

在你觸發你可能有情況是這樣的:

where ProductID = (Select ProductId From SalesTable) 

看看你是否可以把它改成

where ProductID IN (Select ProductId From SalesTable) 

是的觸發器文本是與此有關。

+0

感謝您的迴應。如果您再次查看我的帖子,我添加了觸發代碼。我相信問題在於我從「插入」中獲取值。如果一次只更新一條記錄,那就可以正常工作。如果我一次更新多個,它不能從「插入」中獲取值。 – user3653673 2014-10-02 18:18:28

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是一個整數,不能將行數據作爲其賦值。

我想你可以通過在循環中運行更新語句來解決這個問題,一次只做一行。但真正的解決方案是更新觸發器。我相信我們可以提供一些關於如何這樣做的建議 - 雖然你說過你無法更新觸發器。

+0

感謝您的回覆。我也在考慮做一個循環,但我希望有一個更簡單的方法。另一位用戶在我選擇使用的評論中發佈了一個解決方案。他建議禁用觸發器,運行語句,然後再次啓用觸發器。 – user3653673 2014-10-02 19:10:30

1

感謝xQbert在我的問題下留言,解決了我的問題,而無需重寫我的觸發器。他的解決方案是禁用觸發器,進行更新,然後在更新後重新啓用觸發器。由於當我運行更新時我的系統將被關閉,這將工作正常。但是,如果您在實時系統中遇到同樣的問題,那麼在執行此操作時也應該在表格上加鎖。

ALTER TABLE SalesTable DISABLE TRIGGER SalesTrigger 

UPDATE SalesTable 
    SET ProductId = NULL 
WHERE ProductId = 0 

ALTER TABLE SalesTable ENABLE TRIGGER SalesTrigger 
+0

+1非常出色的工作,以正確的語法考慮你的評論並作出回答。我很高興你收到了所需的指導,並且自己開發解決方案。 (並且讓人們這樣思考,不,這不是諷刺) – xQbert 2014-10-03 13:09:28