CONVERT([varchar](4),@Year,(0))+'-01-01'
передается на вызов DATEDIFF
в позиции, где ожидается ожидаемая дата, что приводит к неявному преобразованию.
Из правил для детерминированных функций :
CAST
Определяется, если не используется с
datetime
,smalldatetime
илиsql_variant
.
CONVERT
Определительно, если не существует одно из этих условий:
...
Тип источника или цели
blockquote>datetime
илиsmalldatetime
, другой источник или цель type является символьной строкой, и указан недетерминированный стиль. Чтобы быть детерминированным, параметр стиля должен быть константой. Кроме того, стили, меньшие или равные 100, являются недетерминированными, за исключением стилей 20 и 21. Стили более 100 являются детерминированными, за исключением стилей 106, 107, 109 и 113.вы не вызываете никого, но вы полагаетесь на неявное преобразование, которое я ожидаю, как
CAST
. Вместо того, чтобы полагаться на это, я бы переключился на использованиеCONVERT
и дал детерминированный параметр стиля.Итак, я сделал бы:
CONVERT(datetime,CONVERT([varchar](4),@Year,(0))+'0101',112)
на своем месте. Сделав это, сама функция становится детерминированной