SQL Server为什么在函数内部geography :: Point是不确定的?

时间:2019-05-26 07:32:27

标签: sql-server sql-function sqlgeography

我存储来自用户的纬度和经度(浮点null)数据,并希望基于这些值创建一个持久化的Geography数据类型计算列(目的是在此列上使用空间索引)。

计算的列公式为:

(case when @lat IS NULL OR @lng IS NULL then NULL else [geography]::Point(@lat,@lng,(4326)) end)

当在计算列上将persistent设置为true时,这将按预期工作(当存在“纬度”和“经度”时返回Geography值,否则返回null。

但是,我希望将其抽象为用户定义的函数,因为其他表将使用相同的计算。我创建了以下功能:

CREATE FUNCTION [dbo].[GetGeography] 
(
    @lat float null,
    @lng float null
)
RETURNS geography
AS
BEGIN   
    RETURN (case when @lat IS NULL OR @lng IS NULL then NULL else [geography]::Point(@lat,@lng,(4326)) end)
END

当我尝试在计算列公式中使用此函数并将其设置为true时,出现以下错误消息:

Computed column 'Geog_LatLng' in table 'Tmp_Locations' cannot be persisted because the column is non-deterministic.

没有关于POINT的确定性的文档,并且Deterministic Functions上的文档没有提到地理位置或点。

短期解决方案是只在所有表之间复制公式,但是我想知道是否有可能将公式抽象为用户定义的函数。

1 个答案:

答案 0 :(得分:0)

解决方案是使用with schemabinding

CREATE FUNCTION [dbo].[GetGeography] 
(
    @lat float null,
    @lng float null
)
WITH SCHEMABINDING -- <--- modified
RETURNS geography
AS
BEGIN   
    RETURN (case when @lat IS NULL OR @lng IS NULL then NULL else [geography]::Point(@lat,@lng,(4326)) end)
END

Docs中有一个解释。