Я храню данные широты и долготы (плавающего нуля) от пользователя и хочу создать постоянный вычисляемый столбец типа данных Geography на основе этих значений (с намерением использовать пространственный индекс для этого столбца).
Формула вычисляемого столбца:
(case when @lat IS NULL OR @lng IS NULL then NULL else [geography]::Point(@lat,@lng,(4326)) end)
Работает, как и ожидалось, когда для сохраненного значения установлено значение true для вычисляемого столбца (возвращает значение Geography при наличии широты и долготы, в противном случае возвращает ноль.
Однако я хочу абстрагировать это в определяемую пользователем функцию, так как другие таблицы будут использовать те же вычисления. Я создал следующую функцию:
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 , а в документации по Детерминированные функции не упоминается география или точка.
Краткосрочное решение состоит в том, чтобы просто повторить формулу во всех таблицах, но я хотел бы знать, возможно ли абстрагировать формулу в определяемую пользователем функцию.