Почему это преобразование типа отклонено как недетерминированное для вычисляемого столбца PERSISTED
в таблицах возврата пользовательских функций (UDF) в SQL Server?
CREATE FUNCTION MyTimeIntervalFunction(@Param1 INT)
RETURNS @MyTimeInterval TABLE
(
StartUtc DATETIME NOT NULL PRIMARY KEY
,EndUtc DATETIME NOT NULL
,DateUtc AS CONVERT(DATE, StartUtc) PERSISTED
)
AS BEGIN
--do stuff
RETURN
END
Обратите внимание, что это не преобразование в или из строкового представления, поэтому я не будузнаю, почему это не работает, потому что глобализация / регион должны быть неактуальными.
Это работает вне UDF (включая хранимые процедуры):
DECLARE @MyTimeInterval TABLE
(
StartUtc DATETIME NOT NULL PRIMARY KEY
,EndUtc DATETIME NOT NULL
,DateUtc AS CONVERT(DATE, StartUtc) PERSISTED
)
INSERT INTO @MyTimeInterval(StartUtc, EndUtc)
VALUES ('2018-01-01', '2018-01-02')
SELECT * FROM @MyTimeInterval
Кажется, что добавление WITH SCHEMABINDING
к определению UDF закрывает его, но я не понимаю почему, потому что, похоже, это только отмечаетфункция выводит как детерминированная на основе входных параметров.И я должен сделать другие недетерминированные вещи в моей функции, так что это не обходной путь кандидата.
Wonky манипулирование строками также может бытьОбходной путь, но не является предпочтительным. Стиль 126 для ISO-8601 на CONVERT
по-прежнему недетерминирован в соответствии с SQL Server.Кажется, единственный вариант - отказаться от использования сохраненных вычисляемых столбцов?