SQL Server的SQL语法不正确

SQL Server的SQL语法不正确,sql,sql-server,geolocation,Sql,Sql Server,Geolocation,我对使用SQL是相当陌生的,我知道我的语法是不正确的,我在正确使用SQL时遇到了一些问题。我想创建一个函数来计算包含纬度和经度的两个位置之间的距离。我的表名为Comm和Fac,它们都有纬度和经度列。它们位于名为Fac_Comm的数据库中(两个表都在同一台服务器上)。我想按ASU代码分组,然后返回以英里为单位的距离 我收到的错误:变量未声明,Fac_Comm.Comm.Latitude的多部分标识符无法绑定,组附近的语法不正确 这是我的密码: CREATE FUNCTION Miles (

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

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

这是我的密码:

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
用于组合相似的数据行,并使用
SUM
AVG
等函数来聚合数据

您只需返回一个值并进行一些计算

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语言的<代码>设置是ANSI标准

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

我们可以告诉SSMS使用Fac_Comm数据库,并为以下所有语句设置数据库上下文,而不是在查询的每个部分都引用数据库(这有点混乱)。我已将此添加到查询的开头

SELECT
语句中调用名为
Miles
的函数。在本例中,四列作为参数传递,结果列为“DistanceInMiles”。还包括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,但在这两者之间您需要一个FROMFac_Comm.Comm.Latitude意味着您有一个架构名称“Fac_Comm”,该架构中有一个名为“Comm”的表,该表中有一列名为“Latitude”。如果这些表在dbo模式中,正确的引用应该是Fac_Comm.dbo.Comm.Latitude

FROM Fac_Comm.dbo.Comm 
在“选择”之后但在“分组依据”之前

  • 您选择@distance,但从未将其设置为任何值。你想用你的选择设置它吗

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


  • 虽然输入float和输出INT在函数中不进行转换是不好的,因为数字会发生变化。因此,最好返回float或使用适当的转换和舍入来获得准确的距离。我收到一个错误,上面写着“Msg 209,级别16,状态1,第30行不明确的列名‘ASUCODE’。”哦,对不起!这是因为Fac和Comm都有相同的列。您可以改用
    Comm.[ASUCODE]
    。我更新了帖子。