在 INSTEAD OF 触发器中使用 text、ntext 和 image 数据
数据修改可能会涉及 text、ntext 和 image 列。在基表中,存储在 text、ntext 或 image 列中的值是文本指针,它指向保存数据的页。有关详细信息,请参阅行内数据。
注意 |
---|
使用 text、ntext 和 image 数据只是为了向后兼容。存储大型数据的首选方法是使用 varchar(max)、nvarchar(max) 和 varbinary(max) 数据类型。AFTER 触发器和 INSTEAD OF 触发器均支持在插入的和删除的表中使用 varchar(max)、nvarchar(max) 和 varbinary(max) 数据。 |
虽然 AFTER 触发器不支持在插入的和删除的表中使用 text、ntext 或 image 数据,但 INSTEAD OF 触发器支持。text、ntext 和 image 数据在插入的和删除的表中的存储方式与在基表中的存储方式不同。text、ntext 和 image 数据不是各自作为一个页链存储的,而是在每行中作为连续的字符串存储的。这意味着在插入的和删除的表中,text、ntext 或 image 列没有文本指针。TEXTPTR 函数、TEXTVALID 函数、READTEXT 语句、UPDATETEXT 语句和 WRITETEXT 语句对插入的或删除的表中的 text、ntext 或 image 列无效。对 text、ntext 或 image 列的任何其他使用均受支持。例如,在选择列表、WHERE 子句搜索条件、SUBSTRING 函数、PATINDEX 函数或 CHARINDEX 函数中引用它们。在 INSTEAD OF 触发器中,对 text、ntext 或 image 数据的操作受当前 SET TEXTSIZE 选项的影响。此值可由 @@TEXTSIZE 函数来确定。
存储在插入的和删除的表中的 text、ntext 或 image 数据的类型随着触发操作(INSERT、UPDATE 或 DELETE)的不同而有所不同:
执行 INSERT 语句后,插入的表的 text、ntext 或 image 列中将包含新值,而删除的表不包含行。
执行 DELETE 语句后,插入的表中没有行,而删除的表行中包含 DELETE 启动前 text、ntext 或 image 列中包含的值。
执行 text、ntext 或 image 值没有改变的 UPDATE 语句后,插入的和删除的表行的 text、ntext 或 image 列中包含相同的值。
执行 text、ntext 或 image 值发生改变的 UPDATE 语句后,删除的表中包含 UPDATE 启动前存在的数据值,而插入的表中包含 SET 子句中指定的修改后的数据。
如果 INSERT、UPDATE、或 DELETE 语句修改了含有较大的 text、ntext 或 image 值的很多行,则需要大量内存来备份插入的和删除的表中 text、ntext 或 image 数据。复制大量的数据还会降低性能。如果 INSERT、UPDATE 和 DELETE 语句引用了具有 INSTEAD OF 触发器的视图或表,应尽可能每次修改一行,或者一次仅修改几行。