use*_*431 5 sql-server spatial-query sql-server-2016
我需要在 SQL Server 2016 中的两个空间表之间进行空间交集,每个表中都有一个几何列。我有一段 T-SQL,我从一个表 (tableA) 中获取一组多边形,然后使用每个多边形并对另一个表(表B)执行STIntersects。我生成了一系列与 tableA 中的多边形数量相对应的独立表。这些表具有相同的列。
declare @g geometry
declare @t Cursor
Set @t = CURSOR FOR select Shape from admin where NAME1 = 'Jefferson'
open @t
FETCH Next FROM @t INTO @g
while @@FETCH_STATUS = 0
BEGIN
Select * from ANC where ANC.Shape.STIntersects(@g) = 1
FETCH Next FROM @t INTO @g
END;
Run Code Online (Sandbox Code Playgroud)
这将返回正确的信息,并为每个相交的多边形提供一个结果表和单独的地图。下一步是将上述各个输出组合到一个输出表中,但我遇到了困难。我尝试了以下方法:
declare @g geometry
declare @t Cursor
Set @t = CURSOR FOR select Shape from admin where NAME1 = 'Jefferson'
open @t
declare @firstone bit
Set @firstone = 1
FETCH Next FROM @t INTO @g
while @@FETCH_STATUS = 0
BEGIN
IF @firstone = 1
BEGIN
Select * INTO #myTempTable from ANC where ANC.Shape.STIntersects(@g) = 1
Set @firstone = 0
END
ELSE
BEGIN
Select * from #myTempTable UNION Select * from ANC where ANC.Shape.STIntersects(@g) = 1
END;
FETCH Next FROM @t INTO @g
END;
Select * From #myTempTable
Run Code Online (Sandbox Code Playgroud)
这会返回一个错误,说明我们无法与地理数据类型进行联合。有一个 STUnion 函数,但我还没有看到它与两个表一起工作。更好的选择是能够在两个空间表之间执行空间标识函数,但还没有找到这样的例子。但是,如果我可以在两层之间进行空间交集,然后将结果合并,我就可以得到一个粗略的等价物。因此,我的第一步是让空间相交跨两个空间层工作。
你不需要光标。加入会在这里做
SELECT *
FROM table1 A
INNER JOIN table2 b ON b.Shape.STIntersects(A.Shape) = 1
where A.NAME1 = 'Jefferson'
Run Code Online (Sandbox Code Playgroud)