Sebelum saya mengirim item sambung tentang kurangnya dokumentasi tentang hal ini, apakah seseorang akan mengonfirmasi bahwa saya tidak hanya melewatkan sesuatu di sini?
Pada halaman dokumen tempat format
terdaftar sebagai fungsi string:
"Semua fungsi string bawaan bersifat deterministik." - Fungsi String (Transact-SQL)
Juga tidak disebutkan tidak format
bersifat deterministik pada halaman terkait:
Namun, saat mencoba membuat kolom yang dihitung tetap:
create table t (date_col date);
insert into t values (getdate());
alter table t add date_formatted_01 as format(date_col,'YYYY') persisted;
Mengembalikan kesalahan berikut:
Kolom yang dihitung 'date_formatted_01' pada tabel 't' tidak dapat dipertahankan karena kolom tersebut non-deterministik.
Dokumentasi menyatakan itu
Jika argumen budaya tidak disediakan, bahasa sesi saat ini digunakan.
tetapi menambahkan argumen budaya tidak mengubah banyak hal
Ini juga gagal
alter table t add date_formatted_02 as format(date_col, 'd', 'en-US' ) persisted
demo rextester: http://rextester.com/ZMS22966
Demo dbfiddle.uk: http://dbfiddle.uk/?rdbms=sqlserver_next&fiddle=7fc57d1916e901cb561b551af144aed6
sumber
alter table #t add date_formatted_01 as CONVERT(VARCHAR(20), FORMAT(date_col, 'YYYY', 'en-US')) persisted;
. Tidak yakin mengapaFORMAT
tidak deterministik, terutama saat menentukan budaya. Thedate_formatted
kolom dapat dilakukanVARCHAR(20)
(masih bertahan) dan diatur melalui Pemicu menggunakanFORMAT
. Atau SQLCLR berfungsi. Menggunakan perpustakaan SQL # SQLCLR (yang saya tulis), Anda dapat melakukannyaALTER TABLE SQL#.t ADD date_formatted_03 AS SQL#.Date_Format(date_col, 'd', 'en-US') PERSISTED;
(tabel dimiliki oleh SQL # karena pemilik tabel dan fungsi harus sama).Jawaban:
Suatu fungsi belum tentu deterministik atau nondeterministik. Ada beberapa fungsi yang dapat ditentukan tergantung pada bagaimana mereka digunakan :
CAST
danCONVERT
merupakan contoh seperti itu. Berdasarkan pengujian yang telah Anda lakukan sejauh ini, saya pikir itu adil untuk mengatakan bahwaFORMAT
tidak selalu deterministik, meskipun merupakan fungsi string. Jika Anda ingin tahu apakah kadang-kadang deterministik, satu-satunya teknik yang dapat saya pikirkan adalah mencoba berbagai cara untuk menyebutnya sampai Anda puas. Sebagai contoh, mari kita pertimbangkanFORMAT
sebagaimana diterapkan pada angka. Hanya ada sepuluh jenis input numerik yang berbeda :Tampaknya juga hanya ada sembilan format angka yang berbeda . Dimungkinkan untuk mencoba membuat kolom tetap untuk semua kemungkinan kombinasi. Beberapa kode untuk melakukannya adalah di bawah ini:
Berikut contoh hasilnya:
Saya tidak bisa mendapatkan salah satu kolom yang akan ditambahkan ke tabel untuk beberapa nilai input dan budaya. Saya tidak mencoba semua budaya yang mungkin karena saya tidak dapat menemukan daftar mereka dalam SQL Server.
Setidaknya sepertinya aman untuk menyimpulkan bahwa dokumentasi mengenai determinisme
FORMAT
tidak benar, jadi saya akan merekomendasikan mengirimkan item terhubung untuk itu.sumber
The
FORMAT
dokumentasi kini telah diperbarui (dalam menanggapi Anda barang Connect ) mengatakan:Demikian juga, Fungsi String (Transact-SQL) sekarang termasuk:
sumber
Saya bukan pengguna sqlserver biasa, jadi saya mungkin salah, tapi dugaan saya adalah format itu bukan fungsi string. Menurut dokumentasi:
https://docs.microsoft.com/en-us/sql/t-sql/functions/format-transact-sql
Format mengambil tipe tanggal atau tipe numerik sebagai argumen. Jika yang ingin Anda lakukan hanyalah mengambil bagian tahun dari tanggal, tidak bisakah Anda menggunakan fungsi tahun?
jika Anda ingin representasi string:
sumber