2010-06-21 125 views
4

我在執行存儲過程中的以下查詢時遇到以下錯誤。任何人都可以幫助找到錯誤嗎?UPDATE不允許,因爲語句更新參與聯接並具有INSTEAD OF UPDATE觸發器的視圖「table_name」

UPDATE不允許,因爲語句更新視圖「sup_item」,它參與聯接並具有INSTEAD OF UPDATE觸發器。

UPDATE si 
SET 
    name = mc.name, 
    sup_item_cat_id = mc.res_sup_item_cat_id, 
    xf_value = mc.xf_value, 
    ava_start_date = mc.ava_start_date, 
    ava_end_date = mc.ava_end_date, 
    status_code = mc.status_code, 
    last_mod_us_id = CASE WHEN mc.last_mod_us_id = 42 THEN @posting_us_id 
        ELSE mc.last_mod_us_id END, 
    last_mod_tsp = CURRENT_tsp 
FROM sup_item AS si 
    JOIN merch_cat_imp_sup_item AS mc 
     ON mc.sup_id = si.sup_id 
     AND mc.res_sup_item_id = si.sup_item_id 
     AND mc.cat_imp_event_id = @cat_imp_event_id 
     AND mc.accept_flag = 'y' 
WHERE si.shi_flag = 'n' 

我發現參考:http://msdn.microsoft.com/en-us/library/ms177523.aspx

的視圖與INSTEAD OF UPDATE觸發器不能是 UPDATE與FROM子句的目標。

所以,我不得不重寫UPDATE語句(它仍然是在過程中)不使用sup_item(這是一個視圖),但保持基礎表(一個或多個)需要。

有人可以重寫它,如果有人知道該怎麼辦?

+1

請將代碼發佈到SUP_ITEM視圖後面,以便我們能夠更好地爲您提供幫助。 – 2010-06-21 13:44:50

+1

使用底層視圖sup_item下的表編寫查詢是不可能的,而實際上並不知道這些表是什麼或它們在視圖中如何使用。 – 2010-06-21 14:07:26

回答

2

該問題不在您的查詢範圍內。根據你的問題的評論,你正在更新的實體[sup_item]實際上不是一張表,而是一個視圖。該視圖上有一個INSTEAD OF UPDATE觸發器。

你能夠發佈視圖和觸發器的SQL嗎?

13

您可以使用MERGE來實現此目的。嘗試:

MERGE INTO sup_item si 
USING merch_cat_imp_sup_item AS mc 
     ON mc.sup_id = si.sup_id 
     AND mc.res_sup_item_id = si.sup_item_id 
     AND mc.cat_imp_event_id = @cat_imp_event_id 
     AND mc.accept_flag = 'y' 
     AND si.shi_flag = 'n' 
WHEN MATCHED 
THEN UPDATE 
SET 
    name = mc.name, 
    sup_item_cat_id = mc.res_sup_item_cat_id, 
    xf_value = mc.xf_value, 
    ava_start_date = mc.ava_start_date, 
    ava_end_date = mc.ava_end_date, 
    status_code = mc.status_code, 
    last_mod_us_id = CASE WHEN mc.last_mod_us_id = 42 THEN @posting_us_id 
        ELSE mc.last_mod_us_id END, 
    last_mod_tsp = CURRENT_tsp 
+2

這對我很好。稍微困惑一下爲什麼它會 - 雖然典型的更新沒有,但我會歡迎任何關於合併爲什麼的建議。 – 2013-09-11 09:14:43

+0

太棒了!拯救了我的一天! – 2017-03-28 09:50:56

0

我也會感興趣,因爲我有一個存儲過程,我已經繼承了數據庫,它試圖做到這一點。它不會讓我在SQL 2014中創建sproc,但它在sproc中存在的事實告訴我,早期版本的SQL Server必須允許這樣做。

+0

我有這個完全相同的場景。曾在SQL Server的早期版本中工作,但未在2014年完成。 – Manachi 2015-08-07 00:27:38

0

也許在早期版本中,您的過程在桌上操作,後來由視圖替換。

你應該用標準的ANSI語法更新你的「update from」語法。

+0

在這種情況下,「標準ANSI語法」會是什麼樣子? – deroby 2015-11-13 12:25:57

+0

這個答案看起來更相關。今天,我在SQL Server 2008中出現了同樣的錯誤,原因是一個表被INSTEAD OF UPDATE觸發器的視圖取代。不幸的是INSTEAD OF UPDATE觸發器只有在更新視圖的UPDATE語句沒有FROM子句時才起作用。這在問題中對Microsoft庫的原始引用中進行了描述。此外,我認爲上述有關「update from」語法的評論指的是UPDATE FROM不是標準的ANSI SQL(即使它很有用!)。 – Ubercoder 2016-09-07 13:24:07