2012-02-11 6 views
1

私はここで何かが分かりません。このトリガーは、テーブル内のすべての行を更新しています(強制終了のパフォーマンス)。新しい挿入行で更新を実行するだけです。トリガーが挿入されていないすべての行を更新します

CREATE TRIGGER [dbo].[update_location_topo_name] 
--fires at each row insert, queries topo map layer (must be present!) and inserts name of topo into new location record 
on [dbo].[TBL_LOCATIONS] 
after insert 
AS 
BEGIN 
update TBL_LOCATIONS 
set TOPO_NAME = dbo.QD24K_GRSM.NAME 
FROM dbo.tbl_locations 
inner join dbo.QD24K_GRSM 
on TBL_LOCATIONS.Location_ID = TBL_LOCATIONS.Location_ID 
WHERE (QD24K_GRSM.Shape.STContains(TBL_LOCATIONS.SHAPE) = 1) 
END 
+0

主キーと外部キーを含む 'QD24K_GRSM'と' tbl_locations'のためにあなたのテーブル構造を提供してください。 –

+0

[リンク] http://stackoverflow.com/questions/9046436/can-stwithin-or-stcontains-be-used-to-update-columns-based-on-point-within-polyg [/ link] – tpcolson

+0

objectid is両方のPK。 – tpcolson

答えて

1

挿入された行だけを取得するには、INSERTED疑似テーブルを参照する必要があります。

また、結合条件がTBL_LOCATIONS.Location_ID = TBL_LOCATIONS.Location_IDの場合は、まったく意味がありません。

おそらく、挿入の前に挿入する前に行を変更するトリガーとしてINSTEAD OFトリガーとしてこれを行う方がよいでしょう。

CREATE TRIGGER [dbo].[update_location_topo_name] 
ON [dbo].[TBL_LOCATIONS] 
INSTEAD OF INSERT 
AS 
    BEGIN 
     INSERT INTO TBL_LOCATIONS 
        (foo, 
        bar, 
        TOPO_NAME) 
     SELECT foo, 
      bar, 
      dbo.QD24K_GRSM.NAME 
     FROM INSERTED I 
      LEFT JOIN dbo.QD24K_GRSM 
       ON QD24K_GRSM.Shape.STContains(I.SHAPE) = 1/* Will insert additional 
                rows if more than one match*/ 
    END 
+0

残念ながら、2つのテーブルの間には列の共通性は全くありません。唯一可能な関係は空間的なものです。したがってQD24K_GRSM.Shape.STContains(I.SHAPE)= 1ステートメントです。だから私はQD24Kに挿入された参加方法についてはっきりしていないのですか? – tpcolson

+0

その条件の正確な「1:1」一致レコードが保証されていますか? 0がマッチするか、複数のマッチがある場合に何が起こらないか? –

+0

はい、ビジネス要件があれば、空間テーブル(140)内には有限数のポリゴンがあり、その位置はその1つの境界内でのみ発生することができます。ユーザーは、ポリゴンの境界ボックスに入らない場所を入力することはできません。 – tpcolson

0

「挿入後」ではなく「挿入する」のトリガーを作成することをお勧めします。 これにより、実際にターゲット表に挿入する前に、必要に応じて新しく挿入された行を変更できます。 そして、 "挿入された"テーブルとターゲットテーブルを結合する必要は全くありません。このような

何か(実際にそのコードを実行しないような構文が間違っている可能性があります):

CREATE TRIGGER [dbo].[update_location_topo_name] 
on [dbo].[TBL_LOCATIONS] 
Instead Of insert 
AS 
BEGIN 
    Insert Into TBL_LOCATIONS (...., TOPO_NAME) 
    Select ..., CrTable.NAME as TOPO_NAME 
     From Inserted Cross Apply 
     (
       Select top 1 QD24K_GRSM.NAME from QD24K_GRSM where 
       QD24K_GRSM.Shape.STContains(Inserted.SHAPE) = 1 
     ) as CrTable 
END 
関連する問題