不正确的 SQL 语法 SQL 服务器



我对使用SQL相当陌生,我知道我的语法不正确,而且我在正确处理这个问题时遇到了一些问题。我想创建一个函数来计算包含纬度和经度的两个位置之间的距离。我的表名为 Comm 和 Fac,它们都有纬度和经度列。它们位于名为 Fac_Comm 的数据库中(表都在同一台服务器上)。我想按 ASU 代码分组,然后以英里为单位返回距离。

我收到的错误:变量未声明,无法绑定Fac_Comm.Comm.Latitude的多部分标识符以及GROUP附近的语法不正确。

这是我的代码:

CREATE FUNCTION Miles
(
@latitude_1 float,
@longitude_1 float,
@latitude_2 float,
@longitude_2 float
)
RETURNS int    
AS
BEGIN
DECLARE @radiusOfTheEarth int 
SET @radiusOfTheEarth = 6371--km
DECLARE @distance int  
SELECT Fac_Comm.Comm.Latitude,
Fac_Comm.Comm.Longitude,
Fac_Comm.Fac.Latitude,
Fac_Comm.Fac.Longitude
SELECT @distance = ( @radiusOfTheEarth 
* acos( cos( radians(@latitude_1) ) 
* cos( radians( @latitude_2 ) ) 
* cos( radians( @longitude_2 ) - radians(@longitude_1) ) + sin( 
radians(@latitude_1) )  * sin( radians( @latitude_2 ) ) ) )
GROUP BY Fac_Comm.Fac.ASUCODE, Fac_Comm.Comm.ASUCODE
RETURN @distance
END

我认为这就是你要找的。你们离得很近。

对于您的函数,您实际上没有任何列,您正在根据所有输入参数进行计算。所以你不需要第一个SELECT子句。GROUP BY用于将类似行的数据与SUMAVG等函数组合在一起以聚合数据。

你只是返回一个值并做一些数学运算。

CREATE FUNCTION Miles
(
@latitude_1 float,
@longitude_1 float,
@latitude_2 float,
@longitude_2 float
)
RETURNS int    
AS
BEGIN
DECLARE @radiusOfTheEarth int 
DECLARE @distance int
SET @radiusOfTheEarth = 6371--km
SELECT @distance = ( @radiusOfTheEarth 
* acos( cos( radians(@latitude_1) ) 
* cos( radians( @latitude_2 ) ) 
* cos( radians( @longitude_2 ) - radians(@longitude_1) ) 
+ sin( radians(@latitude_1) )  * sin( radians( @latitude_2 ) ) ) )
RETURN @distance
END

我还移动了您的一个变量声明,以将它们全部保存在一起。不过,语法没有任何问题。只是一个好的做法。

需要注意的一点是,使用SELECT设置变量值特定于 SQL SERVER 中使用的 T-SQL 语言。SET是ANSI标准。

我还意识到您可能想知道如何调用该函数。我们可以使用从函数中删除的一些代码。

与其在查询的每个部分中引用数据库(这有点混乱),我们可以告诉 SSMSUSEFac_Comm数据库,并为以下所有语句设置数据库上下文。我已将其添加到查询的开头

调用您在SELECT语句中Miles命名的函数。在本例中,四列作为参数传递,生成的列为"DistanceInMiles"。还包括 ASUCODE 列,以便输出显示与里程计算关联的代码。

我做了一个假设,你的意思是JOIN而不是GROUP BY.这将合并两个匹配的 ASUCODE 中都有记录的表。因此,如果此查询未运行,请随时发表评论,我可以更新帖子以修复它。

USE Fac_Comm; 
SELECT [dbo].[Miles](Comm.Latitude, 
Comm.Longitude,
Fac.Latitude,
Fac.Longitude) AS DistanceInMiles,
Comm.[ASUCODE]
FROM Comm
JOIN Fac 
ON Comm.[ASUCODE] = Fac.[ASUCODE]  

希望这有帮助! 如果您有疑问或问题,请随时发表评论。

有几个立即可见的问题:
1.你有一个 SELECT 和一个 GROUP BY,但在这两者之间你需要一个 FROM。Fac_Comm.Comm.Latitude表示您有一个架构名称"Fac_Comm",该架构中有一个名为"Comm"的表,并且该表中有一个名为"Latitude"的列。如果表位于 dbo 架构中,则正确的引用是Fac_Comm.dbo.Comm.Latitude

FROM Fac_Comm.dbo.Comm 

在"选择"之后,但在"分组依据"之前

  1. 选择了@distance,但您从未将其设置为任何内容。 您是否尝试使用您的选择设置它?

  2. 您在我认为是单个查询中重复 SELECT 关键字

最新更新