使用 INSTEAD OF 觸發程序中的 text、ntext 及 image 資料
資料修改可能會涉及 text、ntext 與 image 資料行。在基底資料表中,儲存於 text、ntext 或 image 資料行中的值是一種文字指標,會指向含有資料的頁面。如需詳細資訊,請參閱<同資料列資料>。
![]() |
---|
使用 text、ntext 與 image 資料僅為了提供回溯相容性。儲存大型資料時,較適合使用的是 varchar(max)、nvarchar(max) 與 varbinary(max) 資料類型。AFTER 與 INSTEAD OF 觸發程序皆支援在 inserted 與 deleted 資料表中使用 varchar(max)、nvarchar(max) 與 varbinary(max) 資料。 |
雖然 AFTER 觸發程序不支援在 inserted 與 deleted 資料表中使用 text、ntext 或 image 資料,但 INSTEAD OF 觸發程序確實支援它們。text、ntext 與 image 資料儲存在 inserted 與 deleted 資料表中的方式,不同於資料儲存於基底資料表中的方式。text、ntext 與 image 資料不會儲存為個別的頁面鏈結。而是會儲存為每個資料列中的連續字串。這表示,在 inserted 與 deleted 資料表中並沒有 text、ntext 或 image 資料行的文字指標。TEXTPTR 與 TEXTVALID 函數,以及 READTEXT、UPDATETEXT 與 WRITETEXT 陳述式對於 inserted 或 deleted 資料表中的 text、ntext 或 image 資料行無效。text、ntext 或 image 但支援資料行的所有其他使用方式,例如,在選取清單、WHERE 子句搜尋條件、或 SUBSTRING、PATINDEX 或 CHARINDEX 等函數中加以參考。INSTEAD OF 觸發程序中 text、ntext 或 image 資料上的作業,會受到目前 SET TEXTSIZE 選項的影響。此值可透過 @@TEXTSIZE 函數來決定。
儲存在 inserted 與 deleted 資料表中的 text、ntext 或 image 資料的類型,會隨著觸發動作 (INSERT、UPDATE 或 DELETE) 而有所不同:
- 在 INSERT 陳述式中,inserted 資料表包含 text、ntext 或 image 資料行的新值。deleted 資料表沒有任何資料列。
- 在 DELETE 陳述式中,inserted 資料表並沒有資料列,而 deleted 資料表資料列則包含 text、ntext 或 image 資料行在 DELETE 啟動之前所包含的值。
- 在未變更 text、ntext 或 image 值的 UPDATE 陳述式中,inserted 與 deleted 資料表資料列在 text、ntext 或 image 資料行中會包含相同的值。
- 在會變更 text、ntext 或 image 值的 UPDATE 陳述式中,deleted 資料表所含的資料值會與 UPDATE 啟動之前的值相同,而 inserted 資料表所含的資料則含有 SET 子句所指定的任何修改。
若 INSERT、UPDATE 或 DELETE 陳述式修改了許多含有大型 text、ntext 或 image 值的資料列,則可能需要大量記憶體來存放 inserted 與 deleted 資料表中的 text、ntext 或 image 資料副本。複製大量資料也會降低效能。參考具有 INSTEAD OF 觸發程序之檢視或資料表的 INSERT、UPDATE 或 DELETE 陳述式,在修改資料列時應盡量採用逐一修改或一次修改數個資料列的方式。