如何从空间查询更新表

时间:2012-03-02 07:20:06

标签: sql-server-2008 spatial

我在SQL Server 2008中有两个表A和B:

A
lon(float)
lat(float)
name (nvarchar)

B
name (nvarchar)
the_geom (geometry)

基本上,表B包含区域多边形,而表A包含两列中的点坐标。如果lon / lat列中定义的点在表B中的多边形内,我想用区域名更新表A.什么是正确的T-SQL命令?到目前为止,这是我不成功的查询:

UPDATE A SET name = (SELECT name FROM B WHERE
the_geom.STIntersects(geography::Point([A.lat], [A.Lon], 4326))>0)

3 个答案:

答案 0 :(得分:1)

以下适用于我:

UPDATE Deals SET Area = (
    SELECT NAME FROM Areas WHERE 
        the_geom.STIntersects(
            geometry::STGeomFromText(
                'POINT(' + CAST(Deals.Lon AS varchar) + ' ' + CAST(Deals.Lat AS varchar) + ')',4326)
                ) = 1
    )

答案 1 :(得分:0)

似乎是在混合空间类型和x / y。 (几何与地理不同)。

您可以将查询编写为:

UPDATE A SET name = (SELECT name FROM B WHERE 
    the_geom.STIntersects(
          geometry::STPointFromText(
               'POINT(' + [A.long] + ' ' + [A.lat] + ')', 4326
          )
    )=1)

实际上没有尝试过上述内容,但它应该提供解决问题所需的一切。如果你想继续使用Geography,那么你也可以像你一样创建它,将它恢复为WKB,然后通过WKB(几何:: STGeomFromWKB(geography :: AsBinary())

恢复到几何实例

答案 2 :(得分:0)

这可能听起来像'dahh'但是你不应该使用deals.lon而不是A.lon吗?

UPDATE交易SET area =(SELECT name FROM areas WHERE the_geom.STIntersects(geometry :: STPointFromText(' POINT(' + [deals]。[lon] +'' + [deal]。[lat] +')',4326))= 1)