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?
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