1

こんにちはフォークス:SQL Server 2008のPointsテーブルに挿入した後に起動するトリガーを作成しようとしています。最初に機能しているように見えますが、緯度と経度の値をどのように変更しても、その後の挿入では、地理フィールドはまったく同じままです

USE GIS

IF EXISTS(SELECT name FROM SYSOBJECTS WHERE name = 'PointCreationTrigger' and type = 'TR')
DROP TRIGGER [dbo].[PointCreationTrigger]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[PointCreationTrigger] 
   ON  [dbo].[Points] 
   AFTER INSERT
AS 
BEGIN
        SET NOCOUNT ON;

    DECLARE @Point AS GEOGRAPHY
    DECLARE @Longitude AS FLOAT
    DECLARE @Latitude AS FLOAT
    DECLARE @WKT AS VARCHAR(256) -- well known text representation of a point

    SET @Longitude = (SELECT i.Longitude FROM inserted i)
    SET @Latitude = (SELECT i.Latitude FROM inserted i)

   IF @Latitude IS NOT NULL AND @Longitude IS NOT NULL
   BEGIN
        IF @Latitude > -90 AND @Latitude < 90 AND @Longitude > -180 AND @Longitude < 180
        BEGIN
            SET @WKT = (SELECT 'POINT(' + CONVERT(VARCHAR(16),@Longitude) + ' ' + CONVERT(VARCHAR(16), @Latitude) + ')')
            SET @Point = geography::STGeomFromText(@WKT, 4326);
            UPDATE [dbo].[Points] SET Point = @Point
        END
    END
END
GO

助言がありますか...?

4

1 に答える 1

0

現在使用している SQL を、トリガーを起動したステートメントに含まれるすべての行に影響する単一の更新ステートメントに書き直すことができます。

@HLGEM のコメントを参照し、注意してください。トリガーは SQL ステートメントごとに 1 回だけ起動し、そのステートメントによって影響を受けたすべての行を考慮する必要があります。

update
    p
set
    Point = geography::STGeomFromText('POINT(' + CONVERT(VARCHAR(16), i.Longitude) + ' ' + CONVERT(VARCHAR(16), i.Latitude) + ')', 4326)
from
    inserted i
inner join
    dbo.Points p
        on p.PointsID = i.PointsID
        and i.Latitude > -90
        and i.Latitude < 90
        and i.Longitude > -180
        and i.Longitude < 180

前提:結合する 1 つ以上の PK フィールドがある。

提案:これをより堅牢にするために、またはが有効な値でない場合は、条件付きでPoint値を に設定する必要があります。NULLLatitudeLongitude

別の可能性:これはニーズに合わないかもしれませんが、ポイント データの文字列バージョンをテーブル内の永続的な計算列に格納して、トリガーを不要にすることもできます。これの欠点は、geography データ型ではなく varchar 列でなければならないことです。そのため、geography データ型を積極的に使用している場合、このアプローチはより多くの変換を意味します。トリガーは変換を 1 回だけ実行します。

于 2012-06-27T23:22:47.780 に答える