wake-up-neo.net

Perché il casting di un campo DATE nel tipo di dati VARCHAR non è deterministico ed esiste un modo per renderlo deterministico?

Sto cercando di creare una vista indicizzata in cui l'indice si trova su un campo nella vista che è un hash di un gruppo di colonne della tabella sottostante nella vista.

Ecco un esempio:

CREATE VIEW CoolHashedView WITH SCHEMABINDING AS

    SELECT 
        KeyId,
        CONVERT
        (
            VARCHAR(34), 
            HASHBYTES('MD5', TextColumn1 + '||' + TextColumn2 + '||' + CAST(DateColumn1 AS VARCHAR(50)), 
            2
        ) AS HashedData
    FROM dbo.BoringTable;

    CREATE UNIQUE CLUSTERED INDEX IX_CoolHashedView_KeyId_HashedData ON CoolHashedView (KeyId, HashedData);

Quando provo a creare l'indice sopra, non riesce e viene generato il seguente errore:

Messaggio 2729, livello 16, stato 1, riga 26 Colonna "HashedData" nella vista "CoolHashedView" non può essere utilizzato in un indice o nelle statistiche o come chiave di partizione perché non è deterministico.

Quando rimuovo il campo della data dalla funzione HASHBYTEs, l'indice cluster viene quindi creato correttamente.

Suppongo che abbia a che fare con i diversi modi di formattare una data o diversi fusi orari? ... mi sto riscaldando?

12
J.D.

CAST non è deterministico perché il formato della data può cambiare in base alle impostazioni del server (vale a dire sotto compatibilità prima del formato data predefinito 110 è 0 => "12 dic 2019 14:11" e l'output dipende dalla lingua).
Per renderlo deterministico usa CONVERT e

il parametro di stile 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. (dalla documentazione seguente)

Ulteriori documentazione su: Funzioni deterministiche e non deterministiche

27
Piotr