SQL Server的SQL语法不正确
我对使用SQL是相当陌生的,我知道我的语法是不正确的,我在正确使用SQL时遇到了一些问题。我想创建一个函数来计算包含纬度和经度的两个位置之间的距离。我的表名为Comm和Fac,它们都有纬度和经度列。它们位于名为Fac_Comm的数据库中(两个表都在同一台服务器上)。我想按ASU代码分组,然后返回以英里为单位的距离 我收到的错误:变量未声明,Fac_Comm.Comm.Latitude的多部分标识符无法绑定,组附近的语法不正确 这是我的密码: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 (
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
在“选择”之后但在“分组依据”之前
虽然输入float和输出INT在函数中不进行转换是不好的,因为数字会发生变化。因此,最好返回float或使用适当的转换和舍入来获得准确的距离。我收到一个错误,上面写着“Msg 209,级别16,状态1,第30行不明确的列名‘ASUCODE’。”哦,对不起!这是因为Fac和Comm都有相同的列。您可以改用
Comm.[ASUCODE]
。我更新了帖子。