如何从SQL Server中的大分隔文件创建多个表,以及如何设置空间查询

如何从SQL Server中的大分隔文件创建多个表,以及如何设置空间查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个大的垂直条分隔文件,其中包含大约128000行,其中包含由第1列中的公共编号指定的多个作业代码,我还有另一个文件,其中包含两列,一列包含作业代码编号,另一列包含说明 我想做的是将每个职务代码分离到自己的表中,其中包括姓名、地址和邮政编码。填充表格后,我需要确定不同作业代码之间的距离,并显示作业b与作业a之间最近的位置。我建议您仔细查看(SSI) SSIS就是为这种工作而设计的——它允许您加载、解析、转换并最终将来自任何类型源的数据存储到SQL Server中 您可以将其作为一次性导入运行

我有一个大的垂直条分隔文件,其中包含大约128000行,其中包含由第1列中的公共编号指定的多个作业代码,我还有另一个文件,其中包含两列,一列包含作业代码编号,另一列包含说明


我想做的是将每个职务代码分离到自己的表中,其中包括姓名、地址和邮政编码。填充表格后,我需要确定不同作业代码之间的距离,并显示作业b与作业a之间最近的位置。

我建议您仔细查看(SSI)

SSIS就是为这种工作而设计的——它允许您加载、解析、转换并最终将来自任何类型源的数据存储到SQL Server中


您可以将其作为一次性导入运行,也可以将包存储起来,以便以后重新使用,以便以后可能需要导入的其他文件。

我假设您使用的是SQL 2008,它支持空间数据

听起来您可以在同一个站点(即地址)上有多个作业,因此我将创建一个作业表,其中外键指向一个站点表,该表包含所有地址信息的列和一个类型为的附加列

您需要设置一个流程,用地理代码信息(即地址的纬度和经度)填充该地理类型列,这是一个SSIS流程,使用MapPoint(现在是Bing Maps)服务,可能是开发您自己的流程的良好起点

一旦您能够获得地址的地理代码,更新SQL表就很容易了

UPDATE Sites
SET GeoLocation = GEOGRAPHY::POINT(@latitude, @longitude, 4326)
WHERE SiteID = @siteId
无论您在管道中的何处集成地理编码器,我都建议您以这样一种方式对其进行抽象,即您可以轻松地更改地理编码服务提供商或指定在运行时使用哪一个,因为这些服务都有不同的定价方案,并且相互使用可能在经济上有利。例如,谷歌每年提供912500个免费请求,每天最多2500个,没有会话限制,而as Bing每年只提供500000个请求,没有每天限制,但会话限制为125000个。因此,对于大批量请求,必应获胜,但对于每项或随机请求,谷歌排名第一。最终,这些服务的数据质量是可比的,因此更改数据源以避免费用是无害的

一旦导入数据并填充地理代码,计算距离和查找最近邻居就变得很简单了

DECLARE @Sites TABLE ( SiteId INT )

--Get the site ids you care about
INSERT INTO @Sites
SELECT SiteId FROM Jobs WHERE Status = 'Open'

/*
 *  For each site in your table variable @Sites, this will list 
 *  all the other sites in the variable in order of distance.
 */
SELECT p.SiteId
     , s.SiteId
     , p.GeoLocation.STDistance(s.SiteId) * 0.001 AS [Distance (Kilometers)] --https://www.google.com/search?q=meters+to+kilometers
     , p.GeoLocation.STDistance(s.SiteId) * 0.000621371192 AS [Distance (Miles)] --https://www.google.com/search?q=meters+to+miles
FROM Sites AS [p]
JOIN Sites AS [s]
    ON s.SiteId != p.SiteId
    AND s.SiteId IN (SELECT SiteId FROM @Sites)
WHERE p.SiteId IN (SELECT SiteId FROM @Sites)
ORDER BY p.SiteId, s.SiteId, p.GeoLocation.STDistance(s.GeoLocation)

将每个作业代码分离到自己的表中有什么好处?是否有多行代码相同?