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



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

计算列公式为:

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

当在计算列上将持久化设置为 true 时,这将按预期工作(当存在纬度和经度时返回地理值,否则返回 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 确定性的文档,关于确定性函数的文档也没有提到地理或点。

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

解决方案是使用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

文档中有解释。

相关内容

  • 没有找到相关文章

最新更新