Sql server SQL Server 2008 STR2包含使用两个表的空间联接

Sql server SQL Server 2008 STR2包含使用两个表的空间联接,sql-server,join,geometry,Sql Server,Join,Geometry,我已经在这方面做了一段时间了,但一事无成,所以我希望比我更有技能的人能找到答案 我有两个表,其中一个是一组作为独立列的纬度和经度坐标。在第二个表中,我将多边形形状设置到空间几何列中 目标是从表1中选择所有纬度和经度对,可以单独称为: SQLSTRING=“从dbo.Table1中选择LAT,LONG;” 可以使用脚本语言循环调用第二个表,通过使用以下查询逐个解析每个结果: SQLSTRING=“SELECT*FROM dbo.Table2 a,其中a.POLY.STContains(geomet

我已经在这方面做了一段时间了,但一事无成,所以我希望比我更有技能的人能找到答案

我有两个表,其中一个是一组作为独立列的纬度和经度坐标。在第二个表中,我将多边形形状设置到空间几何列中

目标是从表1中选择所有纬度和经度对,可以单独称为:

SQLSTRING=“从dbo.Table1中选择LAT,LONG;”

可以使用脚本语言循环调用第二个表,通过使用以下查询逐个解析每个结果:

SQLSTRING=“SELECT*FROM dbo.Table2 a,其中a.POLY.STContains(geometry::STPointFromText('点(&-表1中的经度值-&“”&-表1中的经度值-&'),0))=1;”

因此,我的困境是,从表1中选择所有项目并通过一个查询运行它们肯定是可能的,该查询只会返回那些来自表1的纬度和经度包含在表2中存储的任何指定多边形中的结果。脚本语言循环显然效率很低,因此一个SQL查询可以取代它并只返回任何匹配项,这将大大节省时间和资源


任何帮助或指点都将不胜感激。提前感谢您的建议。

因为您正在处理空间数据,所以可以进行交叉连接(将两个表中的所有行连接在一起),然后筛选出匹配的行

SELECT  *
FROM   dbo.Table2 AS a
       , dbo.Table1 AS b
WHERE  a.POLY.STContains(geometry::STPointFromText('POINT('+CAST(b.LONG AS VARCHAR)+' '+CAST(b.LAT AS VARCHAR)+')',0))=1;

这里性能的一个问题是需要重复生成几何体对象。如果可以创建一列来保存表1的几何图形,则效果会更好。确保在表2中的POLY上也有一个空间索引。

非常感谢您的回复,这看起来比我尝试(但失败)使用的可怕的长SQL字符串要简单得多。我试过你的例子,但它抛出了一个同样长的错误,它与b.long和b.LAT被传递到STContains的位置有关。以下是我正在尝试的:
SELECT*FROM dbo.ShapeGeometryTable AS a,dbo.LatLongPairTable AS b,其中a.POLY.STContains(geometry::STPointFromText('POINT(b.LONG b.LAT))=1你对我用这个在基本面上把球扔到哪里的想法?再次感谢您的索引建议!你能粘贴一些(最好是全部)错误信息吗?要创建几何体点,需要传入如下列:
SELECT*FROM dbo.ShapeGeometryTable AS a,dbo.LatLongPairTable AS b,其中a.POLY.STContains(geometry::STPointFromText('point('+b.LONG++'+b.LAT'+),0))=1特里,你问了关于发生了什么的基础知识。首先,您需要确保语法正确,以便生成几何体对象。创建几何体对象后,请使用与STContains参数相同的SQL。请使用以下最新示例尝试:
a.POLY.STContains(geometry::STPointFromText('POINT('+b.LONG+'+b.LAT'+'),0))从dbo.LatLongPairTable中选择geometry::STPointFromText('POINT('+b.LONG+'+b.LAT'+'),0))=1
我现在收到此错误-Microsoft OLE DB Provider for ODBC驱动程序错误'80040e07'[Microsoft][ODBC SQL Server驱动程序][SQL Server]将数据类型varchar转换为浮点时出错。上一个错误太长,无法容纳分配给此答复的空间,但由于此错误约为长度的1/20,我们似乎离此越来越近。=)再次感谢!太好了,听起来不错。上一个错误是因为尝试转换文本“b.LONG b.LAT”转换为坐标。当前错误是因为您试图在不告诉SQL转换方式的情况下混合文本和数字。请尝试以下操作:
a.POLY.STContains(geometry::STPointFromText('POINT('+CAST(b.LONG AS VARCHAR)+'+CAST(b.LAT AS VARCHAR)+',0))=1