我有下表
正如你所能看到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从中选择了纬度和经度。
我需要这样做的原因是因为在我们的应用程序中,我们允许最终用户按半径进行搜索。
任何帮助都会很棒。
答案 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
几个笔记