Hi Folks:我正在尝试编写一个触发器,在插入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
有任何建议......?
答案 0 :(得分:0)
您可以将当前拥有的SQL重写为单个更新语句,该语句会影响触发该触发器的语句中包含的所有行。
请参阅@HGGEM的评论,并注意。触发器每个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字段。
建议:为了使其更加健壮,如果Point
或NULL
,您应该有条件地将Latitude
值设置为Longitude
不是有效值。
备选可能性:这可能不符合您的需求,但您可以将点数据的字符串版本存储在表中的持久计算列中,从而无需触发器。这样做的缺点是它必须是varchar列而不是geography数据类型,所以如果你正在积极使用geography数据类型,这种方法意味着更多的转换。触发器只会执行一次转换。