2010-07-05 30 views
11

我收到錯誤「無法在」已插入「和」已刪除「表格中使用文本,ntext或圖像列,因爲那裏是原始表中的ntext字段,我附加了一個觸發器。無法在「已插入」和「已刪除」表格中使用文本,ntext或圖像列

這裏是一個解決方案:http://lazycodeprogrammer.blogspot.com/2009/08/how-to-use-inserteddeleted-with.html

但是原始(未修正)查詢是足夠複雜。我應該使用JOIN運算符來寫入,而不是SELECT * FROM INSERTED,因爲它建議使用?

+0

你到底想幹什麼?你能告訴我們你的觸發器(至少是它最相關的部分)嗎?你的問題不是很清楚...... – 2010-07-05 09:40:41

+0

我試圖在我的觸發器中插入行。如果我執行「SELECT * FROM INSERTED」查詢,我得到「不能在'已插入'和'已刪除表'錯誤中使用文本,ntext或圖像列。我知道爲什麼:因爲原始表格包含ntext字段。 我該如何修改我的查詢來解決此問題? – noober 2010-07-05 09:50:57

+0

@noober,沒有你展示任何SQL,任何人都可以說只是實現你在鏈接中發佈的內容。 – 2010-07-05 13:07:12

回答

8

一個很好的解決方案已經發現:

  1. SELECT爲由插入(正在執行它不NTEXT或圖像和查詢)只是ID列。
  2. 從原始表格*中選擇相同的ID。
  3. 如果需要,請使用INSERTED上的UPDATED()來了解哪些列已被更改。
+3

這實際上不是很好的解決方案。雖然插入的表可以正常工作,但刪除表後,此方法是錯誤的,因爲您將在更新後接收值,而不是在更新之前。 – buhtla 2013-02-14 15:24:17

13

真正的問題是,您正嘗試在插入的表格中選擇ntext,text或image類型的列。這在觸發器中是不允許的。

真正的解決方案是將MS的建議更改爲nvarchar(max),text到varchar(max)和image到varbinary(max)。

MS聲明這些類型已被棄用,並將在未來版本中刪除。

此外,由於沒有行內數據,因此ntext的性能非常低。

+4

大聲笑。那麼,最大的問題是MS告訴我們「這些類型已被棄用,並且將在未來的版本中被刪除,bla bla bla」,但他們自己使用它們。猜猜是哪兒?在SharePoint DB中。而且我必須知道,儘管有NTEXT,哪些行被更改以及哪些字段發生了更改,這些行被廣泛且積極地用於存儲列表。我知道,你會說:「不要直接使用DB,而是使用OM」。請不要。去年我在幾個項目中一直在探索糟糕的OM,我想要的性能和功能集只能在數據庫級別上使用。 – noober 2010-08-07 08:29:01

0

使用插入後,下面的觸發器上yourtable

SELECT textfields 
FROM yourtable 
WHERE EXISTS (
    SELECT 1 
    FROM {inserted/deleted} 
    WHERE {inserted/deleted}.PK = {yourtable}.PK 
) 
相關問題