it-swarm.asia

Mengapa casting bidang DATE ke tipe data VARCHAR non-deterministik dan apakah ada cara untuk membuatnya deterministik?

Saya mencoba untuk membuat tampilan diindeks di mana indeks berada di bidang dalam tampilan yang merupakan hash dari sekelompok kolom dari tabel yang mendasari dalam tampilan.

Ini sebuah contoh:

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);

Ketika saya mencoba membuat indeks di atas, gagal dan kesalahan berikut dilemparkan:

Msg 2729, Level 16, Negara Bagian 1, Baris 26 Kolom 'HashedData' dalam tampilan 'CoolHashedView' tidak dapat digunakan dalam indeks atau statistik atau sebagai kunci partisi karena tidak deterministik.

Ketika saya menghapus bidang tanggal dari fungsi HASHBYTEs, indeks berkerumun kemudian berhasil dibuat.

Dugaan saya apakah ini ada hubungannya dengan berbagai cara untuk memformat tanggal atau zona waktu yang berbeda? ... apakah saya semakin hangat?

12
J.D.

CAST tidak deterministik karena format tanggal dapat berubah berdasarkan pada pengaturan server (mis. Di bawah kompatibilitas sebelum 110 format tanggal standar adalah 0 => "12 Desember 2019 2:11 PM" dan output tergantung pada bahasa).
Untuk membuatnya deterministik gunakan CONVERT dan

parameter style harus berupa konstanta. Selain itu, gaya yang kurang dari atau sama dengan 100 tidak bersifat deterministik, kecuali untuk gaya 20 dan 21. Gaya yang lebih besar dari 100 adalah deterministik, kecuali untuk gaya 106, 107, 109 dan 113. (dari dokumentasi di bawah)

Dokumentasi lebih lanjut di: Fungsi Deterministic dan Nondeterministic

27
Piotr