2011-04-06 26 views
5

như tất cả chúng ta đều biết, khung thực thể không thể chứa dữ liệu địa lý. Ý tưởng của tôi là, để chỉ định kinh độ và vĩ độ làm số thập phân trong mô hình của tôi. Sau khi thực thi kịch bản lệnh SQL để tạo các bảng, tôi sẽ bắt đầu một kịch bản lệnh khác để thêm một cột địa lý. Sau đó, tôi muốn cập nhật cột này trên mọi INSERT hoặc UPDATE (trên kinh độ và vĩ độ) bằng một trình kích hoạt. Kích hoạt sau đây có ổn không, hoặc nó có gì xấu không? Tôi hỏi vì tôi không quen với kích hoạt, nhưng nó hoạt động ngay bây giờ.Trình kích hoạt cho INSERT và UPDATE trên cùng một bảng

 

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 
 

Sẽ rất vui nếu ai đó có thể giúp tôi.

Trân

Edit:

kịch bản trông giống như rằng:

 

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 
    ) 
) 
 

công trình nhưng không thể truy vấn cột rằng:/ Thx

+1

kích hoạt của bạn sẽ gây ra toàn vẹn dữ liệu vấn đề nếu bất kỳ quá trình nào từng cập nhật hoặc chèn một loạt bản ghi. Không bao giờ viết trình kích hoạt giả định chỉ có một bản ghi sẽ được chèn vào. – HLGEM

+0

cách sửa đổi nó? – john

+0

Bỏ phiếu cho mục Kết nối này: http://connect.microsoft.com/SQLServer/feedback/details/378126/how-to-persist-a-calculated-geometry-or-geography-column –

Trả lời

5

Hãy thử một cột vẫn kiên trì tính : http://msdn.microsoft.com/en-us/library/ms191250.aspx (có thể cần một dàn diễn viên bên ngoài ở đây)

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 
) 

Điều này tránh phải kích hoạt với hiệu ứng tổng thể tương tự.

Triggers: http://msdn.microsoft.com/en-us/library/ms191524.aspx

kích hoạt của bạn có thể có thể được sửa đổi như sau:

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 

Dưới đây là một ví dụ cho thấy cả hai cột bằng tay và 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

nhưng điều gì sẽ xảy ra nếu kinh độ và vĩ độ thay đổi? – john

+0

@john cột được tính liên tục sẽ được tính toán lại bất kỳ lúc nào hàng được cập nhật, giống như trình kích hoạt - xem liên kết Sách trực tuyến. Trình kích hoạt có thể thông minh hơn và không tính toán mọi thứ bằng cách kiểm tra xem liệu các cột nhất định có thay đổi hay không, nhưng trình kích hoạt cũng phải đảm bảo nó hoạt động trên toàn bộ bảng giả được chèn và không giả định chỉ một hàng. Chỉ có điều bạn có thể cần phải kiểm tra là chức năng hình học là xác định. 'CAST/CONVERT'' VARCHAR' thành 'DATETIME' chẳng hạn không phải là không xác định UNLESS một định dạng cố định được xác định. –

+0

@cade okay. sau đó. cảm ơn :) – john

Các vấn đề liên quan