在表格中更新地理列

时间:2015-04-29 08:25:18

标签: sql-server sql-server-2008 sqlgeography

我有下表

enter image description here

正如你所能看到Geo列(数据类型Geography)为null我在这个表中目前有11913行,我试图做的是使用以下语句更新Geo列并使用以下语句填充Geo列Geography :: STGeomFromText

提供的数据
DECLARE @Temp TABLE
(
Id bigint,
Latitude decimal(9,6),
Longitude decimal(9,6)
)

Insert Into @Temp (Id, Latitude, Longitude)
    Select id, Latitude, Longitude from Location.Cities 
where Active = 1

Update Location.Cities
set Geo = geography::STGeomFromText (POINT(Select Latitude, Longitude from  @Temp), 4326)
where Id = -- massively confused.....

我遇到的两个问题我所说的选择纬度,来自@Temp的经度它说POINT不是公认的内置函数名称,另一个是我如何确保更新正确的记录/行我在哪里#&# 39; ve从中选择了纬度和经度。

我需要这样做的原因是因为在我们的应用程序中,我们允许最终用户按半径进行搜索。

任何帮助都会很棒。

3 个答案:

答案 0 :(得分:3)

您不需要临时表@Temp。您可以直接在表Location.Cities上使用geography::Point

像这样。

Update Location.Cities
set Geo = geography::Point(Latitude, Longitude , 4326)

如果您想使用geography::STGeomFromText,可以像这样使用它。

    Update Location.Cities
        set Geo = geography::STGeomFromText('POINT(' + CONVERT(VARCHAR(30),Longitude ) + ' ' + CONVERT(VARCHAR(30),Latitude) + )',4326)

答案 1 :(得分:0)

ughai的答案会奏效,但你会发现性能问题。您可以使用STPointFromText做得更好:

UPDATE Location.Cities
SET Geo = geography::STPointFromText('POINT(' + CAST([Longitude] AS VARCHAR(20)) + ' ' + CAST([Latitude] AS VARCHAR(20)) + ')', 4326)

作为旁注,你收到错误的原因是因为函数需要一个varchar参数作为它的第一个参数。

答案 2 :(得分:0)

如果是我,我会做以下事情:     声明@batchsize int = 1000;     而(1 = 1)     开始

    Update top(@batchsize) Location.Cities
    set Geo = geography::Point(Latitude, Longitude), 4326)
    where Geo is null;

    if (@@rowcount < @batchsize)
       break;

end

几个笔记

  • Point静态方法是MS扩展。也就是说,它不是标准的OGC方法。但那没关系,它会给你相同的结果。我觉得它更具可读性,因为你不需要创建代表这一点的WKT。
  • 我正在批量处理更新。由于你的桌子大约是10k行,所以它也不应该太多,但如果它更大则重要。这个成语是一个很好的人。