2011-04-06 7 views
5

私たち全員が知っているように、エンティティフレームワークは地理データを保持できません。だから私の考えは、私のモデルでは小数点としての経度と緯度を指定することでした。テーブルを作成するためにSQLスクリプトを実行した後、地理的な列を追加するための別のスクリプトを開始します。それから、私はトリガーによってINSERTまたはUPDATE(経度と緯度)ごとにこの列を更新したいと思います。次のトリガーは大丈夫ですか、それとも悪いですか?私はトリガーにあまり慣れていないので頼んでいますが、今のところうまくいきます。同じテーブルのINSERTとUPDATEのトリガー

 

CREATE TRIGGER Update_Geography 
ON [People] 
FOR INSERT, UPDATE 
AS 
BEGIN 
    DECLARE @longitude DECIMAL(8, 5), @latitude DECIMAL(8, 5) 

    SET @longitude = (SELECT ins.Location_Longitude FROM inserted ins) 
    SET @latitude = (SELECT ins.Location_Latitude FROM inserted ins) 

    IF (@longitude != 0 AND @latitude != 0) 
    BEGIN 
     UPDATE [People] 
     SET 
      Location_Geography = geography::STGeomFromText('POINT(' + CONVERT(VARCHAR(100),@longitude) + ' ' + CONVERT(VARCHAR(100),@latitude) + ')',4326) 
     WHERE 
      Id = (SELECT ins.Id FROM inserted ins) 
    END 
END 
 

誰かが私を助けることができたら嬉しいです。

よろしく

編集:

スクリプトは以下のようになります。

 

ALTER TABLE [People] ADD Location_Geography AS (
    CONVERT(GEOGRAPHY, CASE 
     WHEN Location_Latitude 0 AND Location_Longitude 0 THEN 
      geography::STGeomFromText('POINT(' + CONVERT(VARCHAR, Location_Longitude) + ' ' + CONVERT(VARCHAR, Location_Latitude) + ')',4326) 
     ELSE 
      NULL 
    END 
    ) 
) 
 

は動作しますが、その列を照会することはできません:/ Thxを

+1

あなたのトリガは、データの整合性の原因となりますプロセスがレコードのバッチを更新または挿入した場合の問題。 1つのレコードだけが挿入されていると仮定して、トリガーを書き込まないでください。 – HLGEM

+0

それを変更するには? – john

+0

この接続項目に投票してください:http://connect.microsoft.com/SQLServer/feedback/details/378126/how-to-persist-a-calculated-geometry-orge-gege-column –

答えて

5

PERSISTED計算列を試してみてください:http://msdn.microsoft.com/en-us/library/ms191250.aspx(ここではアウターキャストが必要な場合があります)

Location_Geography AS (
    CASE 
     WHEN Location_Latitude <> 0 AND Location_Longitude <> 0 THEN 
      geography::STGeomFromText('POINT(' + CONVERT(VARCHAR(100),Location_Longitude) + ' ' + CONVERT(VARCHAR(100),Location_Latitude) + ')',4326) 
     ELSE 
     NULL 
    END 
) 

これにより、全体的にほぼ同じ効果を持つトリガーを作成する必要がなくなります。

トリガ:http://msdn.microsoft.com/en-us/library/ms191524.aspx

あなたのトリガーは、おそらくのように変更することができます

CREATE TRIGGER Update_Geography 
ON [People] 
FOR INSERT, UPDATE 
AS 
BEGIN 
     UPDATE [People] 
     SET 
      Location_Geography = geography::STGeomFromText('POINT(' + CONVERT(VARCHAR(100),Location_Longitude) + ' ' + CONVERT(VARCHAR(100),Location_Latitude) + ')',4326) 
     WHERE (UPDATE(Location_Longitude) OR UPDATE(Location_Latitude)) 
      AND Id IN (SELECT ins.Id FROM inserted ins) 
    END 
END 

はここで両方のマニュアルとcalc'ed列を示す例です:

IF EXISTS (SELECT * 
      FROM sys.objects 
      WHERE object_id = OBJECT_ID(N'[dbo].[SO5572806]') 
        AND type IN (N'U')) 
    DROP TABLE [dbo].[SO5572806] 
GO 

CREATE TABLE SO5572806 
    (
    lo DECIMAL(8, 5) NOT NULL 
    ,la DECIMAL(8, 5) NOT NULL 
    ,man GEOGRAPHY NULL 
    ,calc AS (CONVERT(GEOGRAPHY, CASE WHEN la <> 0 
             AND lo <> 0 
            THEN GEOGRAPHY::STGeomFromText('POINT(' 
                   + CONVERT(VARCHAR, lo) 
                   + ' ' 
                   + CONVERT(VARCHAR, la) 
                   + ')', 4326) 
            ELSE NULL 
           END)) 
    ) 
GO 

INSERT INTO dbo.SO5572806 
     (lo, la) 
VALUES (0, 0), 
     (-90, 30) 

UPDATE dbo.SO5572806 
SET  man = GEOGRAPHY::STGeomFromText('POINT(' + CONVERT(VARCHAR, lo) + ' ' 
             + CONVERT(VARCHAR, la) + ')', 4326) 
WHERE lo <> 0 
     AND la <> 0 

SELECT * 
FROM dbo.SO5572806 
+0

しかし、経度と緯度変更? – john

+0

@johnトリガと同じように、行が更新されると、永続的な計算列が再計算されます。そのBooks Onlineリンクを参照してください。トリガーは、よりスマートになり、特定の列が変更されているかどうかをチェックすることで物を計算することはできませんが、挿入された疑似テーブル全体でトリガーが動作していることを確認する必要があります。チェックする必要があるのは、ジオメトリ関数が確定的であることだけです。固定フォーマットが指定されていない限り、 'CAST/CONVERT'' VARCHAR'から 'DATETIME'へのインスタンスは決定的ではありません。 –

+0

@cade大丈夫です。次に。ありがとう:) – john

関連する問題