用于存储点对点距离的SQL函数

时间:2016-11-03 16:18:25

标签: sql function tsql

我正在尝试创建一个SQL函数,该函数将根据Distance表中的里程数将选定点的里程数存储到另一个点。我不熟悉创建函数,但下面的代码是我到目前为止拼凑的代码:

CREATE FUNCTION dbo.GetMiles(@StartLoc VARCHAR, @DestLoc VARCHAR)
RETURNS DECIMAL
AS BEGIN
    DECLARE @Miles DECIMAL

SELECT *
FROM 
(
SELECT *
FROM (
    SELECT Loc1, Loc2, Miles
    FROM Distance
    UNION ALL
    SELECT Loc2, Loc1, Miles
    FROM Distance
    ) AS t1
 )
  t1 
WHERE Loc1 = @StartLoc

INTERSECT

SELECT * 
FROM
(
    SELECT Loc1, Loc2, Miles
    FROM Distance
    UNION ALL
    SELECT Loc2, Loc1, Miles
    FROM Distance
    ) AS t2

WHERE Loc2 = @DestLoc

RETURN @Miles
END

当我运行代码时,我收到以下错误消息:

Msg 444,Level 16,State 2,Procedure GetMiles,Line 7 [Batch Start Line 0]

函数中包含的Select语句无法将数据返回给客户端。

有人可以帮助我使用代码,以便我可以获得@Miles结果,这样我就可以引用结果并将其存储为另一个用户记录表吗?

顺便说一句,我已经测试了SELECT区域中的所有代码,它确实返回了正确的数据,并为变量提供了数据。

1 个答案:

答案 0 :(得分:1)

你的(很奇怪)选择可能返回许多具有许多字段的行而没有任何赋值,这意味着select生成的结果集将由函数返回;这与函数的规范相矛盾,该函数被定义为返回单个十进制数@Miles。除此之外,用于返回值的变量从未给出任何值。

我建议您首先查看您的选择(我不太明白为什么会这样),然后确保在return语句之前为@Miles分配单个十进制值