私は発砲する前に状態を評価する更新トリガーを持っています。トリガーの終わりに、単純な照会を実行するアフターアップデートトリガーを発射したいと思います。しかし、アフタートリガーが正しい解決策であるかどうかはわかりません。いずれにせよ、アフタートリガーを最後に含めると、多くの構文エラーが発生します。追加の例を処理するように変更答えを、受け入れ挿入トリガーの代わりに挿入後の組み合わせ方法?
INSTEAD OF INSERT
AS
BEGIN
IF EXISTS (SELECT 1 FROM inserted WHERE SHAPE IS NOT NULL)
BEGIN
INSERT dbo.TBL_Locations(SHAPE, X_Coord, Y_Coord,objectid, loc_name)
SELECT SHAPE, X_Coord = SHAPE.STX,Y_Coord = SHAPE.STY,objectid, loc_name
FROM inserted;
END
ELSE
BEGIN
INSERT dbo.TBL_Locations(SHAPE, X_Coord, Y_Coord,objectid,loc_name)
SELECT SHAPE=Geometry::STPointFromText('POINT('
+ CAST(X_Coord AS VARCHAR(20)) + ' '
+ CAST(Y_Coord AS VARCHAR(20)) + ')', 26917),
X_Coord, Y_Coord,objectid,loc_name
FROM inserted;
END
END
go
after insert
as
begin
set nocount on;
INSERT INTO TBL_LOCATIONS (TOPO_NAME)
SELECT dbo.QD24K_GRSM.NAME
FROM INSERTED I
LEFT JOIN dbo.QD24K_GRSM
on QD24K_GRSM.Shape.STContains(I.SHAPE) = 1;
go
、私は、この例の恩恵を受けることができるだけではないんだと確信している:アーロンは右である
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
--insert binary xy to geo column when user enters location from non-gis app (a);
--insert topo quad (b) name and county (c) name admin boundary which location occurs
INSERT dbo.TBL_Locations(SHAPE, X_Coord, Y_Coord,objectid, loc_name, TOPO_NAME, County)
SELECT a.Shape, a.X_Coord, a.Y_Coord, a.objectid, a.loc_name, b.NAME, c.name
FROM
(
SELECT
--see if GIS populated geo column, if not, write user-input xy to geometry
SHAPE = CASE WHEN SHAPE IS NOT NULL
THEN SHAPE ELSE Geometry::STPointFromText('POINT('
+ CAST(X_Coord AS VARCHAR(20)) + ' '
+ CAST(Y_Coord AS VARCHAR(20)) + ')', 26917) END,
--if record was created with GIS, then translate binary to human-readable xy
X_Coord = CASE WHEN SHAPE IS NULL THEN X_Coord ELSE SHAPE.STX END,
Y_Coord = CASE WHEN SHAPE IS NULL THEN Y_Coord ELSE SHAPE.STY END,
objectid,
loc_name
FROM inserted
) AS a
--spatial query, what topo quad is this point in?
LEFT OUTER JOIN dbo.QD24K_GRSM AS b
ON b.Shape.STContains(a.Shape) = 1
--spatial query, what county is this point in?
LEFT OUTER JOIN dbo.COUNTY as c
ON c.Shape.STContains(a.Shape) = 1;
END
GO
GO
、これは更新を処理しません。ユーザがxyカラムを変更したり、GISアプリケーションを使用してポイントを移動したりする状況では、少なくともその状況が発生してもクラッシュすることはありません。更新後のトリガーはそれを処理すると思われますが、この段階では、挿入後のまれな点の編集を追跡するのはアプリケーションマネージャーの役割です。ユーザーが指定したXまたはYがNULLの場合、ジオメトリはNULLになり、定期的なDBメインテナンスによってレコードが削除され、手動による場所決定のために、場所が大西洋のどこかにある一時テーブルに移動されます。
トリガーが壊れています。 'inserted'は複数の行を含むことができる疑似テーブルです。したがって、 'IF EXISTS'テストを実行すると、たいていは* single *行のステータスが表示されます。 –
@Damienはい、 'FROM inserted'ビットには、それらの行だけを選択するための同等の' WHERE'節が必要です。私は下の私のソリューションのトリガーを、チェックを全く必要としないように更新しました。 –