Domanda

Nella tradizione di questa domanda e alla luce di la documentazione , come si può rendere deterministica questa funzione:

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

O questo (a causa dei letterali stringa / data - e sì, ho anche provato '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
È stato utile?

Soluzione

BOL afferma che CONVERT è deterministico con i tempi dei dati se viene specificato il parametro style . Quindi se cambi il primo UDF in:

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

Quindi dovrebbe essere deterministico, se capisco correttamente i documenti.

Presumibilmente, lo stesso trucco potrebbe essere usato nel tuo secondo UDF:

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

I in realtà vorrei che ci fosse un modo per specificare valori letterali datetime in T-SQL.

Modifica :

Come sottolineato da Arvo nei commenti ( grazie , Arvo), è possibile utilizzare il formato letterale timestamp ODBC (anche quando si utilizza OLE DB) in modo che la seconda funzione sopra possa essere meglio scritta come :

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

e la conversione in datetime viene eseguita in fase di compilazione anziché in fase di esecuzione. Si noti che il formato della data deve essere molto specifico (consultare Link di Arvo al datetime tipo di dati ):

  

& nbsp; d & nbsp; & nbsp; & nbsp; & nbsp; aaaa-mm-gg
  & Nbsp; t & nbsp; & nbsp; & nbsp; & nbsp; hh: mm: ss [.fff]
  ts & nbsp; & nbsp; & nbsp; & nbsp; yyyy-mm-dd hh: mm: ss [.fff]

Altri suggerimenti

Dagli articoli che hai collegato:

  

Per essere deterministici, il parametro style deve essere una costante. Inoltre, gli stili inferiori o uguali a 100 sono non deterministici, ad eccezione degli stili 20 e 21. Gli stili maggiori di 100 sono deterministici, ad eccezione degli stili 106, 107, 109 e 113.

Devi utilizzare un parametro di stile nelle tue conversioni in datetime.

Ad esempio:

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

Tranne che non usare 121 ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top