【问题标题】:SQL Server 2008 Trigger Insert Latitude & Longitude and Update Geography FieldSQL Server 2008 触发器插入纬度和经度并更新地理字段
【发布时间】:2012-06-27 19:29:16
【问题描述】:

大家好:我正在尝试编写一个触发器,该触发器在插入到 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

有什么建议吗...?

【问题讨论】:

  • 您确定@Latitude@Longitude 在限制范围内吗?例如。 IF 语句被执行。
  • 您不能假设只会插入一条记录,如果在同一条语句中插入多条记录,此触发器将不起作用。您应该始终使用多条记录插入和单条记录插入来测试触发器。

标签: sql-server-2008 triggers insert geography


【解决方案1】:

您可以将当前拥有的 SQL 重写为单个更新语句,该语句会影响触发触发器的语句中包含的所有行。

查看@HLGEM 的评论并注意。每个 SQL 语句触发器只触发一次,并且需要考虑受该语句影响的所有行。

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

假设:您有一个或多个 PK 字段可以加入。

建议:如果LatitudeLongitude 不是有效值,您可能应该有条件地将Point 值设置为NULL

>

另一种可能性:这可能不符合您的需要,但您可以将点数据的字符串版本交替存储在表中的持久计算列中,从而无需触发器。这样做的缺点是它必须是 varchar 列而不是 geography 数据类型,所以如果您正在积极使用 geography 数据类型,这种方法意味着更多的转换。触发器只会执行一次转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-10
    • 2019-02-13
    • 2013-02-08
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多