【发布时间】:2016-05-09 17:39:26
【问题描述】:
我使用 PostgreSQL 作为 SQL Server 的链接服务器。现在,我需要调用 PostgreSQL 函数,它只返回一个整数(标量),但 SQL Server 不允许远程表值函数,并说此查询是表值函数。
CREATE OR REPLACE FUNCTION public.getpointinfo(
IN lng double precision,
IN lat double precision)
RETURNS integer
AS
$$
DECLARE result integer;
begin
result:= case when cwt.k like 'maxspeed' then cast(cwt.v as integer)
else getmaxspeed(s.highway)
end maxspeed
from snapPointToLine(ST_SetSRID(ST_MakePoint($1, $2), 4326)) s
join current_way_tags cwt
on s.id = cwt.way_id
where cwt.k in ('maxspeed', 'highway')
order by cwt.k desc
limit 1;
return result;
end
$$
LANGUAGE plpgsql VOLATILE;
如何修改此 PostgreSQL 查询以返回标量值,或者能够将其用作 SQL Server 中的四部分名称函数,如
select objectid, s.data_source
from testData
outer apply
(
select maxspeed from MB24DB.MobTrack24DB.[public].getpointinfo(X, Y)
) s
openquery 不是一个选项。
【问题讨论】:
-
贴出的函数有明显的语法错误。
-
不应在
from子句中使用标量函数。因为你这样做,我猜 SQL Server 假设它是一个表值函数。而且因为它是一个标量函数,我认为首先不需要使用cross apply。只需将MB24DB.MobTrack24DB.[public].getpointinfo(X, Y)放入select列表(假设您的表testdata有两列x 和y) -
@a_horse_with_no_name 抛出错误:不允许远程函数引用“MB24DB.MobTrack24DB.public.getpointinfo”,并且列名“MB24DB”找不到或不明确。 testData 包含 X 和 Y 列。
-
然后试试
outer apply (select MB24DB.MobTrack24DB.[public].getpointinfo(X, Y) -
@a_horse_with_no_name 同样的错误。
标签: sql-server postgresql remote-server linked-server