无法在“inserted”和“deleted”表中使用text,ntext或image列

时间:2010-07-05 09:12:42

标签: sql-server triggers

我收到错误“无法在'inserted'和'deleted'表中使用text,ntext或image列”,因为原始表中有ntext字段,我已经附加了触发器。

这是一个解决方案:http://lazycodeprogrammer.blogspot.com/2009/08/how-to-use-inserteddeleted-with.html

但原始(非修改)查询足够复杂。我应该使用JOIN运算符编写什么而不是SELECT * FROM INSERTED,因为它是推荐的?

4 个答案:

答案 0 :(得分:15)

真正的问题是您尝试在插入的表中选择ntext,text或image类型的列。触发器不允许这样做。

真正的解决方案是将所有ntext,nvarchar(max),text更改为varchar(max),将image更改为varbinary(max),如MS所建议的那样。

MS声明这些类型已弃用,将在以后的版本中删除。

此外,由于没有行内数据,ntext的性能非常慢。

答案 1 :(得分:8)

找到了一个很好的解决方案:

  1. SELECT FROM INSERTED只是id列(它不是ntext或图像,正在执行查询)。
  2. 使用相同的ID从原始表*中选择。
  3. 如果需要,请在INSERTED上使用UPDATED()以了解哪些列已更改。

答案 2 :(得分:1)

使用“INSTEAD OF”触发器可以解决问题,因为text,ntext和image字段在“inserted”和“deleted”表中可用。 查看http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=148387以了解如何完成。

答案 3 :(得分:0)

yourtable上插入后使用以下触发器:

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