Sql server 将坐标分为龙图和纬度

Sql server 将坐标分为龙图和纬度,sql-server,function,coordinates,Sql Server,Function,Coordinates,我的数据库中的坐标存储为(55.573012889640765,9.72362365248182)。我想做一个函数,得到这个值,然后把它们放在@latitude=55.573012889640765上,然后 @长=9.72362365248182 实际上,这个函数得到坐标,然后分别返回两个点。我想得到这个,这样我可以在以后用这样的函数计算两点之间的距离: CREATE FUNCTION dbo.fnCalcDistanceKM(@lat1 FLOAT, @lon1 FLOAT, @lat2 FL

我的数据库中的坐标存储为(55.573012889640765,9.72362365248182)。我想做一个函数,得到这个值,然后把它们放在@latitude=55.573012889640765上,然后 @长=9.72362365248182

实际上,这个函数得到坐标,然后分别返回两个点。我想得到这个,这样我可以在以后用这样的函数计算两点之间的距离:

CREATE FUNCTION dbo.fnCalcDistanceKM(@lat1 FLOAT, @lon1 FLOAT, @lat2 FLOAT, @lon2 FLOAT)
RETURNS FLOAT 
AS
BEGIN

    RETURN ACOS(SIN(PI()*@lat1/180.0)*SIN(PI()*@lat2/180.0)+COS(PI()*@lat1/180.0)*COS(PI()*@lat2/180.0)*COS(PI()*@lon2/180.0-PI()*@lon1/180.0))*6371
END
正如您所看到的,这个函数要求将点分开,在我的数据库中,我将它们作为一个整体。 你能告诉我如何划分部分或修改上述函数以适合我的代码吗


提前感谢

使用SQL的几何函数可以节省一些工作量

declare @coords1 nvarchar(64) = '(55.573012889640765, 9.72362365248182)'
, @coords2 nvarchar(64) = '(56.573012889640765, 9.72362365248182)'

declare @g1 geometry = geometry::STGeomFromText('POINT' + replace(@coords1,',',' '), 0)
, @g2 geometry = geometry::STGeomFromText('POINT' + replace(@coords2,',',' '), 0)
SELECT @g1.STDistance(@g2);
更多信息请点击此处:


或者,如果您只是想在逗号周围拆分字符串,请看下面的示例:

您可以通过使用SQL的几何函数来节省一些工作量

declare @coords1 nvarchar(64) = '(55.573012889640765, 9.72362365248182)'
, @coords2 nvarchar(64) = '(56.573012889640765, 9.72362365248182)'

declare @g1 geometry = geometry::STGeomFromText('POINT' + replace(@coords1,',',' '), 0)
, @g2 geometry = geometry::STGeomFromText('POINT' + replace(@coords2,',',' '), 0)
SELECT @g1.STDistance(@g2);
更多信息请点击此处:


或者,如果您只是想将字符串拆分为逗号,请看下面的示例:

我更喜欢JonLBevan的答案,但这正是所要求的:

DECLARE @string nvarchar(max) = '(55.573012889640765, 9.72362365248182)';

SELECT @string;

DECLARE @latitude float;
DECLARE @long float;

SELECT @latitude = CONVERT(float, SUBSTRING(@string, 2, charindex(',', @string)-2)),
       @long = CONVERT(float, SUBSTRING(@string, charindex(',', @string)+1, LEN(@string)-charindex(',', @string)-1));

SELECT @latitude, @long;

不过,值得指出的是,最好不要以这种方式存储值,因为在进行范围搜索时,由于涉及的函数,您无法利用任何索引的优势。

我更喜欢JonLBevan的答案,但这确实是要求的:

DECLARE @string nvarchar(max) = '(55.573012889640765, 9.72362365248182)';

SELECT @string;

DECLARE @latitude float;
DECLARE @long float;

SELECT @latitude = CONVERT(float, SUBSTRING(@string, 2, charindex(',', @string)-2)),
       @long = CONVERT(float, SUBSTRING(@string, charindex(',', @string)+1, LEN(@string)-charindex(',', @string)-1));

SELECT @latitude, @long;
但是值得指出的是,最好不要以这种方式存储值,因为在执行范围搜索时,由于涉及的函数,您无法利用索引