【问题标题】:Cannot use text, ntext, or image columns in the 'inserted' and 'deleted' tables不能在“已插入”和“已删除”表中使用 text、ntext 或 image 列
【发布时间】:2011-03-11 20:03:19
【问题描述】:

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

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

但是原始(未修改)查询已经足够复杂了。我应该写什么来代替 SELECT * FROM INSERTED,使用 JOIN 操作符,因为它是推荐的?

【问题讨论】:

  • 你想做什么?你能告诉我们你的触发器(至少是它最相关的部分)吗?你的问题不是很清楚......
  • 我正在尝试在触发器中插入行。如果我执行“SELECT * FROM INSERTED”查询,我会收到“不能在 'inserted' 和 'deleted' 表中使用 text、ntext 或 image 列”错误。我知道为什么:因为原始表包含 ntext 字段。我应该如何修改我的查询来解决这个问题?
  • @noober,没有你显示任何 SQL,任何人都可以说只是实现你在链接中发布的内容。
  • 文章中介绍了所有的SQL。 [UPDATE t SET t.newtext = i.text FROM tbl_Dest t, INSERTED i, DELETED d WHERE t.PK_ID = i.PK_ID] 修改为 [UPDATE t SET t.newtext = s.text FROM tbl_Dest t, tbl_Source s JOIN INSERTED i ON s.PK_ID = i.PK_ID,已删除 d 其中 t.PK_ID = s.PK_ID]。我只是想了解,诀窍是什么。
  • 另请参阅此答案:stackoverflow.com/questions/9101924/…

标签: sql-server triggers


【解决方案1】:

找到了一个不错的解决方案:

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

【讨论】:

  • 这实际上不是很好的解决方案。虽然它适用于插入的表,但对于已删除的表,这种方法是错误的,因为您将在更新之后收到值,而不是在更新之前。
【解决方案2】:

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

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

MS 声明这些类型已被弃用,并将在未来版本中删除。

此外,ntext 的性能确实很慢,因为没有行内数据。

【讨论】:

  • 哈哈。那么,最现实的问题是 MS 告诉我们“这些类型已被弃用,将在未来的版本中删除,bla-bla-bla”,但他们自己使用它们。猜猜是哪儿?在 SharePoint 数据库中。而且我必须知道,尽管 NTEXT 被广泛且积极地用于存储列表,但哪些行发生了更改,哪些字段发生了更改。我知道,你会说:“不要直接使用 DB,而是使用 OM”。请不要。去年我在几个项目中都在探索糟糕的 OM,我想要的性能和功能集只能在 DB 级别上使用。
【解决方案3】:

使用“INSTEAD OF”触发器可能会解决问题,因为 text、ntext 和 image 字段在“inserted”和“deleted”表中可用。 看看http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=148387,看看它是怎么做到的。

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-05
      • 2011-11-25
      • 2022-11-09
      相关资源
      最近更新 更多