不能在“插入”和“删除”表中使用 text、ntext 或 image 列

问题描述 投票:0回答:5

我收到错误“无法在‘插入’和‘删除’表中使用 text、ntext 或 image 列”,因为原始表中有 ntext 字段,我已附加触发器。

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

但是原始(未修改的)查询足够复杂。我应该写什么来代替 SELECT * FROM INSERTED,按照建议使用 JOIN 运算符?

sql-server triggers
5个回答
24
投票

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

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

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

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


15
投票

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

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

1
投票

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


0
投票

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

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

0
投票

通过此联接,您将可以从主表访问触发器中所需的所有字段,并且不会受到任何限制。

CREATE OR ALTER     TRIGGER [dbo].[tr_Insert]
       ON  [dbo].[T_Your_Table]
           AFTER INSERT
       AS 
BEGIN 
     insert into 
     T_Your_Log_Table
            (field1,field2)
    select 
            I.field1
           ,Y.field2 -- type text 
           
    FROM 
            Inserted I join
            T_Your_Table Y on I.Primary_Filed = Y.Primary_Filed
© www.soinside.com 2019 - 2024. All rights reserved.