SQL Server Почему география :: Точка внутри функции недетерминирована? - PullRequest
0 голосов
/ 26 мая 2019

Я храню данные широты и долготы (плавающего нуля) от пользователя и хочу создать постоянный вычисляемый столбец типа данных 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 , а в документации по Детерминированные функции не упоминается география или точка.

Краткосрочное решение состоит в том, чтобы просто повторить формулу во всех таблицах, но я хотел бы знать, возможно ли абстрагировать формулу в определяемую пользователем функцию.

1 Ответ

0 голосов
/ 27 мая 2019

Решение заключается в использовании 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

Объяснение в Документах .

...