5

В традиции this question и в свете the documentation, как можно сделать эту функцию детерминированный:Как сделать преобразования из varchar в datetime детерминированными?

ALTER FUNCTION [udf_DateTimeFromDataDtID] 
(
    @DATA_DT_ID int -- In form YYYYMMDD 
) 
RETURNS datetime 
WITH SCHEMABINDING 
AS 
BEGIN 
    RETURN CONVERT(datetime, CONVERT(varchar, @DATA_DT_ID)) 
END 

Или это одно (из-за строки/даты литералов - и да, я также пытался «1900 -01-01'):

ALTER FUNCTION udf_CappedDate 
(
    @DateTimeIn datetime 
) 
RETURNS datetime 
WITH SCHEMABINDING 
AS 
BEGIN 
    IF @DateTimeIn < '1/1/1900' 
     RETURN '1/1/1900' 
    ELSE IF @DateTimeIn > '1/1/2100' 
     RETURN '1/1/2100' 

    RETURN @DateTimeIn 
END 

ответ

6

BOL говорит, что CONVERTявляется детерминированный с DateTimes, если указан стиль параметр. Так что если вы измените первый UDF для:

RETURN CONVERT(datetime, CONVERT(varchar, @DATA_DT_ID), 112) 

Тогда должно быть детерминированным, если я понимаю правильно документы.

Предположительно, тот же трюк может быть использован в вашей второй UDF:

IF @DateTimeIn < CONVERT(datetime, '1/1/1900', 101) 
    RETURN CONVERT(datetime, '1/1/1900', 101) 

Я действительно желание было способом указать даты-времени литералов в T-SQL.

EDIT:

Как отметил Арво в комментариях (спасибо, Арво), то ODBC метка буквальным формат может быть использован (даже при использовании OLE DB), так что вторая функция выше может лучше писать как:

IF @DateTimeIn < {d '1900-01-01'} 
    RETURN {d '1900-01-01'} 
...etc. 

и преобразование в datetime выполняется во время компиляции вместо времени выполнения. Обратите внимание, что формат даты должен быть очень конкретным (см Arvo's link to the datetime data type):

  д         гггг-мм-дд
  т         чч: мм: сс [.fff ]
ts         yyyy-mm-dd hh: mm: ss [.fff]

2

из статьи вы связаны между собой:

детерминированным, параметр стиля должен быть константой. Кроме того, стили меньше или равны 100 являются недетерминирован, стилей 20, за исключением и 21. Стили больше 100 являются детерминированными, для стилей 106, 107, 109 и 113.

кроме Вы должны использовать параметр стиля в ваших преобразованиях в datetime.

Например:

CONVERT(datetime, '2008-01-01', 121) 

За исключением не используют 121 ...

+0

Итак, нет литальных дат в виде строк в UDF без конвертации? – 2008-11-21 20:55:27

+0

Если строки неявно преобразуются в даты, то эти преобразования не имеют «постоянных» стилей и делают функцию недетерминированной. – 2008-11-21 21:08:16