web-dev-qa-db-ja.com

「挿入」および「削除」テーブルでtext、ntext、またはimage列を使用することはできません

元のテーブルにntextフィールドがあるため、「挿入されたテーブルと削除されたテーブルでテキスト、ntext、または画像の列を使用できません」というエラーが発生しました。トリガーをアタッチしました。

解決策は次のとおりです。 http://lazycodeprogrammer.blogspot.com/2009/08/how-to-use-inserteddeleted-with.html

ただし、元の(変更されていない)クエリは十分に複雑です。推奨されているように、JOIN演算子を使用してSELECT * FROM INSERTEDの代わりに何を書く必要がありますか?

15
noober

素晴らしい解決策が見つかりました:

  1. SELECT FROM INSERTED just id column(ntextまたはimageではなく、クエリが実行されています)。
  2. 同じIDの元のテーブル*からSELECTします。
  3. 必要に応じて、INSERTEDでUPDATED()を使用して、どの列が変更されたかを認識してください。
8
noober

本当の問題は、挿入されたテーブルでntext、text、またはimageタイプの列を選択しようとしていることです。これはトリガーでは許可されていません。

実際の解決策は、MSの提案に従って、すべてのntextをnvarchar(max)に、textをvarchar(max)に、imageをvarbinary(max)に変更することです。

MSは、これらのタイプは非推奨であり、将来のバージョンで削除されると述べています。

また、行内のデータがないため、ntextのパフォーマンスは非常に遅くなります。

15
pdiddy

「INSTEADOF」トリガーを使用すると、テキスト、ntext、および画像フィールドが「挿入」テーブルと「削除」テーブルで使用できるため、問題が解決する場合があります。 http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=148387 を見て、どのように実行できるかを確認してください。

yourtableに挿入した後、次のトリガーを使用します。

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