Tingkat kompatibilitas ALTER DATABASE (Transact-SQL)

Berlaku untuk:ya SQL Server (semua versi yang didukung) Ya Azure SQL Database Ya Azure SQL Managed Instance

Mengatur T-SQL dan perilaku pemrosesan kueri agar kompatibel dengan versi mesin SQL yang ditentukan. Untuk opsi UBAH DATABASE lainnya, lihat MENGUBAH DATABASE.

Untuk informasi selengkapnya tentang konvensi sintaks, lihat Konvensi Sintaks T-SQL.

Sintaks

ALTER DATABASE database_name
SET COMPATIBILITY_LEVEL = { 160 | 150 | 140 | 130 | 120 | 110 | 100 | 90 }

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 dan yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

database_name Adalah nama database yang akan dimodifikasi.

COMPATIBILITY_LEVEL { 160 | 150 | 140 | 130 | 120 | 110 | 100 | 90 | 80 } Adalah versi SQL Server yang databasenya akan dibuat kompatibel. Nilai tingkat kompatibilitas berikut dapat dikonfigurasi (tidak semua versi mendukung semua tingkat kompatibilitas yang tercantum di atas):

Produk Versi Mesin Database Penetapan Tingkat Kompatibilitas Default Nilai Tingkat Kompatibilitas yang Didukung
SQL Server 2019 (15.x) 15 150 150, 140, 130, 120, 110, 100
SQL Server 2017 (14.x) 14 140 140, 130, 120, 110, 100
Azure SQL Database 12 150 160, 150, 140, 130, 120, 110, 100
Azure SQL Database Managed Instance 12 150 160, 150, 140, 130, 120, 110, 100
SQL Server 2016 (13.x) 13 130 130, 120, 110, 100
SQL Server 2014 (12.x) 12 120 120, 110, 100
SQL Server 2012 (11.x) 11 110 110, 100, 90
SQL Server 2008 R2 10.5 100 100, 90, 80
SQL Server 2008 10 100 100, 90, 80
SQL Server 2005 (9.x) 9 90 90, 80
SQL Server 2000 (8.x) 8 80 80

Penting

Nomor versi mesin database untuk SQL Server dan Azure SQL Database tidak sebanding satu sama lain, dan lebih tepatnya adalah nomor build internal untuk produk terpisah ini. Mesin database untuk Azure SQL Database didasarkan pada basis kode yang sama dengan mesin database SQL Server. Yang paling penting, mesin database di Azure SQL Database selalu memiliki bit mesin database SQL terbaru. Azure SQL Database sersi 12 lebih baru dari SQL Server versi 15.

Keterangan

Untuk semua penginstalan SQL Server, tingkat kompatibilitas default dikaitkan dengan versi Mesin Database. Database baru diatur ke tingkat ini kecuali database model memiliki tingkat kompatibilitas yang lebih rendah. Untuk database yang dilampirkan atau dipulihkan dari versi SQL Server sebelumnya, database mempertahankan tingkat kompatibilitas yang ada, jika setidaknya diizinkan minimum untuk instans SQL Server tersebut. Memindahkan database dengan tingkat kompatibilitas yang lebih rendah dari tingkat yang diizinkan oleh Mesin Database secara otomatis mengatur database ke tingkat kompatibilitas terendah yang diizinkan. Ini berlaku untuk database sistem dan pengguna.

Perilaku di bawah ini diharapkan untuk SQL Server 2017 (14.x) saat database dilampirkan atau dipulihkan, dan setelah peningkatan di tempat:

  • Jika tingkat kompatibilitas database pengguna adalah 100 atau lebih tinggi sebelum peningkatan, tingkat kompatibilitas tetap sama setelah peningkatan.
  • Jika tingkat kompatibilitas database pengguna adalah 90 sebelum peningkatan, dalam database yang ditingkatkan, tingkat kompatibilitas diatur ke 100, yang merupakan tingkat kompatibilitas terendah yang didukung di SQL Server 2017 (14.x).
  • Tingkat kompatibilitas database tempdb, model, msdb, dan Resource diatur ke tingkat kompatibilitas default untuk versi Mesin Database tertentu.
  • Database sistem master mempertahankan tingkat kompatibilitas sebelum peningkatan. Ini tidak akan memengaruhi perilaku database pengguna.

Untuk database yang sudah ada sebelumnya yang berjalan pada tingkat kompatibilitas yang lebih rendah, selama aplikasi tidak perlu menggunakan penyempurnaan yang hanya tersedia dalam tingkat kompatibilitas database yang lebih tinggi, ini adalah pendekatan yang valid untuk mempertahankan tingkat kompatibilitas database sebelumnya. Untuk pekerjaan pengembangan baru, atau ketika aplikasi yang ada memerlukan penggunaan fitur baru seperti Pemrosesan Kueri Cerdas dan beberapa Transact-SQL baru, rencanakan untuk meningkatkan tingkat kompatibilitas database ke yang terbaru tersedia. Untuk informasi selengkapnya, lihat Tingkat kompatibilitas dan peningkatan Mesin Database.

Catatan

Jika tidak ada objek dan dependensi pengguna, umumnya aman untuk meningkatkan ke tingkat kompatibilitas default. Untuk informasi selengkapnya, lihat Rekomendasi - database master.

Gunakan ALTER DATABASE untuk mengubah tingkat kompatibilitas database. Pengaturan tingkat kompatibilitas baru untuk database berlaku saat USE <database> perintah dikeluarkan, atau login baru diproses dengan database tersebut sebagai konteks database default. Untuk menampilkan tingkat kompatibilitas database saat ini, kueri compatibility_level kolom dalam tampilan katalog sys.databases .

Catatan

Database distribusi yang dibuat dalam versi SQL Server sebelumnya dan ditingkatkan ke RTM SQL Server 2016 (13.x) atau Paket Layanan 1 memiliki tingkat kompatibilitas 90, yang tidak didukung untuk database lain. Ini tidak berdampak pada fungsionalitas replikasi. Meningkatkan ke paket layanan dan versi SQL Server yang lebih baru akan mengakibatkan tingkat kompatibilitas database distribusi ditingkatkan agar sesuai dengan database master.

Catatan

Pada November 2019, di Azure SQL Database, tingkat kompatibilitas default adalah 150 untuk database yang baru dibuat. Microsoft tidak memperbarui tingkat kompatibilitas database untuk database yang sudah ada. Terserah pelanggan untuk melakukan dengan kebijaksanaan mereka sendiri. Microsoft sangat menyarankan agar pelanggan berencana untuk meningkatkan ke tingkat kompatibilitas terbaru untuk memanfaatkan peningkatan pengoptimalan kueri terbaru.

Untuk menggunakan tingkat kompatibilitas database 120 atau lebih tinggi untuk database secara keseluruhan, tetapi ikut serta dalam model estimasi kardinalitas SQL Server 2012 (11.x), yang memetakan ke tingkat kompatibilitas database 110, lihat MENGUBAH KONFIGURASI CAKUPAN DATABASE, dan khususnya kata kuncinya LEGACY_CARDINALITY_ESTIMATION = ON.

Untuk detail tentang cara menilai perbedaan performa kueri Anda yang paling penting antara dua tingkat kompatibilitas yang berbeda pada Database Azure SQL, lihat Meningkatkan Performa Kueri dengan Tingkat Kompatibilitas 130 di database Azure SQL. Artikel ini mengacu pada tingkat kompatibilitas 130 dan SQL Server, tetapi metodologi yang sama berlaku untuk peningkatan ke tingkat 140 atau lebih tinggi dalam database SQL Server dan Azure SQL.

Untuk menentukan versi Mesin Database yang tersambung dengan Anda, jalankan kueri berikut.

SELECT SERVERPROPERTY('ProductVersion');

Catatan

Tidak semua fitur yang bervariasi menurut tingkat kompatibilitas didukung pada database Azure SQL.

Untuk menentukan tingkat kompatibilitas saat ini, kueri compatibility_level kolom sys.databases.

SELECT name, compatibility_level FROM sys.databases;

Tingkat kompatibilitas dan peningkatan mesin database

Tingkat kompatibilitas database adalah alat berharga untuk membantu modernisasi database dengan memungkinkan mesin database SQL Server ditingkatkan sambil mempertahankan status fungsi yang sama untuk menghubungkan aplikasi dengan mempertahankan tingkat kompatibilitas database pra-peningkatan yang sama. Ini berarti bahwa dimungkinkan untuk meningkatkan dari versi SQL Server yang lebih lama (seperti SQL Server 2008) ke Database SQL Server atau Azure SQL (termasuk Instans Terkelola) tanpa perubahan aplikasi (kecuali untuk konektivitas database). Untuk informasi selengkapnya, lihat Sertifikasi Kompatibilitas.

Selama aplikasi tidak perlu menggunakan penyempurnaan yang hanya tersedia dalam tingkat kompatibilitas database yang lebih tinggi, ini adalah pendekatan yang valid untuk meningkatkan mesin database SQL Server dan mempertahankan tingkat kompatibilitas database sebelumnya. Untuk informasi selengkapnya tentang menggunakan tingkat kompatibilitas untuk kompatibilitas mundur, lihat Sertifikasi Kompatibilitas.

Praktik terbaik untuk meningkatkan tingkat kompatibilitas database

Untuk alur kerja yang direkomendasikan untuk meningkatkan tingkat kompatibilitas, lihat Mengubah Mode Kompatibilitas Database dan menggunakan Penyimpanan Kueri. Selain itu, untuk pengalaman yang dibantu dengan meningkatkan tingkat kompatibilitas database, lihat Meningkatkan Database dengan menggunakan Asisten Penyetelan Kueri.

Tingkat kompatibilitas dan prosedur tersimpan

Saat prosedur tersimpan dijalankan, prosedur ini menggunakan tingkat kompatibilitas database saat ini tempat database ditentukan. Ketika pengaturan kompatibilitas database diubah, semua prosedur tersimpannya secara otomatis dikommpilasikan ulang sesuai.

Menggunakan tingkat kompatibilitas untuk kompatibilitas mundur

Pengaturan tingkat kompatibilitas database memberikan kompatibilitas mundur dengan versi SQL Server sebelumnya dalam apa yang berkaitan dengan T-SQL dan perilaku pengoptimalan kueri hanya untuk database yang ditentukan, bukan untuk seluruh server.

Dimulai dengan mode kompatibilitas 130, rencana kueri baru apa pun yang memengaruhi perbaikan dan fitur sengaja ditambahkan hanya ke tingkat kompatibilitas baru. Ini telah dilakukan untuk meminimalkan risiko selama peningkatan yang timbul dari penurunan performa karena perubahan rencana kueri yang berpotensi diperkenalkan oleh perilaku pengoptimalan kueri baru.

Dari perspektif aplikasi, gunakan tingkat kompatibilitas yang lebih rendah sebagai jalur migrasi yang lebih aman untuk mengatasi perbedaan versi, dalam perilaku yang dikendalikan oleh pengaturan tingkat kompatibilitas yang relevan. Tujuannya harus masih untuk meningkatkan ke tingkat kompatibilitas terbaru pada beberapa titik waktu, untuk mewarisi beberapa fitur baru seperti Pemrosesan Kueri Cerdas, tetapi untuk melakukannya dengan cara yang terkontrol.

Untuk detail selengkapnya, termasuk alur kerja yang direkomendasikan untuk meningkatkan tingkat kompatibilitas database, lihat Praktik Terbaik untuk meningkatkan tingkat kompatibilitas database.

Penting

Fungsionalitas yang dihentikan yang diperkenalkan dalam versi SQL Server tertentu tidak dilindungi oleh tingkat kompatibilitas. Ini mengacu pada fungsionalitas yang dihapus dari mesin database SQL Server. Misalnya, FASTFIRSTROW petunjuk dihentikan pada SQL Server 2012 (11.x) dan diganti dengan OPTION (FAST n ) petunjuk. Mengatur tingkat kompatibilitas database ke 110 tidak akan memulihkan petunjuk yang dihentikan.

Untuk informasi selengkapnya tentang fungsionalitas yang dihentikan, lihat Fungsionalitas mesin database yang dihentikan di SQL Server, dan Fungsionalitas Mesin Database yang Dihentikan pada SQL Server 2014.

Penting

Perubahan mencolok yang diperkenalkan dalam versi SQL Server tertentu mungkin tidak dilindungi oleh tingkat kompatibilitas. Ini mengacu pada perubahan perilaku antara versi mesin database SQL Server. Perilaku T-SQL biasanya dilindungi oleh tingkat kompatibilitas. Namun, objek sistem yang diubah atau dihapus tidak dilindungi oleh tingkat kompatibilitas.

Contoh perubahan melanggar yang dilindungi oleh tingkat kompatibilitas adalah konversi implisit dari jenis data datetime ke datetime2. Di bawah tingkat kompatibilitas database 130, ini menunjukkan peningkatan akurasi dengan memperhitungkan milidetik pecahan, menghasilkan nilai yang dikonversi yang berbeda. Untuk memulihkan perilaku konversi sebelumnya, atur tingkat kompatibilitas database ke 120 atau lebih rendah.

Contoh perubahan yang melanggar yang tidak dilindungi oleh tingkat kompatibilitas adalah:

  • Mengubah nama kolom dalam objek sistem. Pada SQL Server 2012 (11.x) kolom yang single_pages_kb di sys.dm_os_sys_info diganti namanya menjadi pages_kb. Terlepas dari tingkat kompatibilitas, kueri SELECT single_pages_kb FROM sys.dm_os_sys_info akan menghasilkan kesalahan 207 (Nama kolom tidak valid).
  • Menghapus objek sistem. Pada SQL Server 2012 (11.x) sp_dboption dihapus. Terlepas dari tingkat kompatibilitas, pernyataan EXEC sp_dboption 'AdventureWorks2016', 'autoshrink', 'FALSE'; akan menghasilkan kesalahan 2812 (Tidak dapat menemukan prosedur tersimpan 'sp_dboption').

Untuk informasi selengkapnya tentang perubahan yang melanggar, lihat Melanggar Perubahan pada Fitur Mesin Database di SQL Server 2019, Melanggar Perubahan pada Fitur Mesin Database pada SQL Server 2017, Melanggar Perubahan pada Fitur Mesin Database di SQL Server 2016, dan Melanggar Perubahan pada Fitur Mesin Database di SQL Server 2014.

Perbedaan antara tingkat kompatibilitas

Untuk semua penginstalan SQL Server, tingkat kompatibilitas default dikaitkan dengan versi Mesin Database, seperti yang terlihat dalam tabel ini. Untuk pekerjaan pengembangan baru, selalu rencanakan untuk mensertifikasi aplikasi pada tingkat kompatibilitas database terbaru.

Sintaks Transact-SQL baru tidak terjaga oleh tingkat kompatibilitas database, kecuali ketika mereka dapat memutus aplikasi yang ada dengan membuat konflik dengan kode Transact-SQL pengguna. Pengecualian ini di dokumentasikan di bagian berikutnya dari artikel ini yang menguraikan perbedaan antara tingkat kompatibilitas tertentu.

Tingkat kompatibilitas database juga memberikan kompatibilitas mundur dengan versi SQL Server yang lebih lama, karena database yang dilampirkan atau dipulihkan dari versi SQL Server sebelumnya mempertahankan tingkat kompatibilitas yang ada (jika sama atau lebih tinggi dari tingkat kompatibilitas minimum yang diizinkan). Ini dibahas di bagian Menggunakan tingkat kompatibilitas untuk kompatibilitas mundur dari artikel ini.

Dimulai dengan tingkat kompatibilitas database 130, setiap perbaikan dan fitur baru yang memengaruhi rencana kueri telah ditambahkan hanya ke tingkat kompatibilitas terbaru yang tersedia, juga disebut tingkat kompatibilitas default. Ini telah dilakukan untuk meminimalkan risiko selama peningkatan yang timbul dari penurunan performa karena perubahan rencana kueri, yang berpotensi diperkenalkan oleh perilaku pengoptimalan kueri baru.

Perubahan dasar yang memengaruhi rencana ditambahkan hanya ke tingkat kompatibilitas default dari versi baru Mesin Database adalah:

  1. Perbaikan Pengoptimal Kueri yang dirilis untuk versi SQL Server sebelumnya di bawah bendera pelacakan 4199 menjadi diaktifkan secara otomatis dalam tingkat kompatibilitas default versi SQL Server yang lebih baru. Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2016 (13.x)) dan Database Azure SQL.

    Misalnya, ketika SQL Server 2016 (13.x) dirilis, semua perbaikan Pengoptimal Kueri yang dirilis untuk versi SQL Server sebelumnya (dan tingkat kompatibilitas masing-masing 100 hingga 120) menjadi diaktifkan secara otomatis untuk database yang menggunakan tingkat kompatibilitas default SQL Server 2016 (13.x) (130). Hanya perbaikan Pengoptimal Kueri pasca-RTM yang perlu diaktifkan secara eksplisit.

    Catatan

    Untuk mengaktifkan perbaikan Pengoptimal Kueri, Anda bisa menggunakan metode berikut:

    Kemudian, ketika SQL Server 2017 (14.x) dirilis, semua perbaikan Pengoptimal Kueri yang dirilis setelah RTM SQL Server 2016 (13.x) menjadi diaktifkan secara otomatis untuk database menggunakan tingkat kompatibilitas default SQL Server 2017 (14.x) (140). Ini adalah perilaku kumulatif yang mencakup semua perbaikan versi sebelumnya juga. Sekali lagi, hanya perbaikan Pengoptimal Kueri pasca-RTM yang perlu diaktifkan secara eksplisit.

    Tabel berikut ini meringkas perilaku ini:

    Versi Mesin Database (DE) Tingkat Kompatibilitas Database TF 4199 Perubahan QO dari semua Tingkat Kompatibilitas Database sebelumnya Perubahan QO untuk versi DE pasca-RTM
    13 (SQL Server 2016 (13.x)) 100 hingga 120


    130
    Nonaktif
    Aktif

    Nonaktif
    Aktif
    Nonaktif
    Aktif

    Aktif
    Aktif
    Nonaktif
    Aktif

    Nonaktif
    Aktif
    14 (SQL Server 2017 (14.x)) 100 hingga 120


    130


    140
    Nonaktif
    Aktif

    Nonaktif
    Aktif

    Nonaktif
    Aktif
    Nonaktif
    Aktif

    Aktif
    Aktif

    Aktif
    Aktif
    Nonaktif
    Aktif

    Nonaktif
    Aktif

    Nonaktif
    Aktif
    15 (SQL Server 2019 (15.x)) dan 12 (Database Azure SQL) 100 hingga 120


    130 hingga 140


    150
    Nonaktif
    Aktif

    Nonaktif
    Aktif

    Nonaktif
    Aktif
    Nonaktif
    Aktif

    Aktif
    Aktif

    Aktif
    Aktif
    Nonaktif
    Aktif

    Nonaktif
    Aktif

    Nonaktif
    Aktif

    Penting

    Pengoptimal Kueri memperbaiki bahwa mengatasi hasil yang salah atau kesalahan pelanggaran akses tidak dilindungi oleh bendera pelacakan 4199. Perbaikan tersebut tidak dianggap opsional.

  2. Perubahan pada Kardinalitas Estimator yang dirilis pada SQL Server dan database Azure SQL diaktifkan hanya dalam tingkat kompatibilitas default versi Mesin Database baru, tetapi tidak pada tingkat kompatibilitas sebelumnya.

    Misalnya, ketika SQL Server 2016 (13.x) dirilis, perubahan pada proses estimasi kardinalitas hanya tersedia untuk database yang menggunakan tingkat kompatibilitas default SQL Server 2016 (13.x) (130). Tingkat kompatibilitas sebelumnya mempertahankan perilaku estimasi kardinalitas yang tersedia sebelum SQL Server 2016 (13.x).

    Kemudian, ketika SQL Server 2017 (14.x) dirilis, perubahan yang lebih baru pada proses estimasi kardinalitas hanya tersedia untuk database yang menggunakan tingkat kompatibilitas default SQL Server 2017 (14.x) (140). Tingkat kompatibilitas database 130 mempertahankan perilaku estimasi kardinalitas SQL Server 2016 (13.x).

    Tabel berikut ini meringkas perilaku ini:

    Versi Mesin Database Tingkat Kompatibilitas Database Perubahan CE versi baru
    13 (SQL Server 2016 (13.x)) < 130
    130
    Dinonaktifkan
    Aktif
    14 (SQL Server 2017 (14.x)1 < 140
    140
    Dinonaktifkan
    Aktif
    15 (SQL Server 2019 (15.x)1 < 150
    150
    Dinonaktifkan
    Aktif

    1 Juga berlaku untuk database Azure SQL.

Penting

Perbedaan lain antara tingkat kompatibilitas tertentu tersedia di bagian berikutnya dari artikel ini.

Perbedaan antara tingkat kompatibilitas 140 dan tingkat 150

Bagian ini menjelaskan perilaku baru yang diperkenalkan dengan tingkat kompatibilitas 150.

Pengaturan tingkat kompatibilitas 140 atau lebih rendah Pengaturan tingkat kompatibilitas 150
Gudang data relasional dan beban kerja analitik mungkin tidak dapat memanfaatkan indeks penyimpan kolom karena overhead OLTP, kurangnya dukungan vendor atau batasan lainnya. Tanpa indeks penyimpan kolom, beban kerja ini tidak dapat memperoleh manfaat dari mode eksekusi batch. Mode eksekusi batch sekarang tersedia untuk beban kerja analitik tanpa memerlukan indeks penyimpan kolom. Untuk informasi selengkapnya, lihat mode batch di rowstore.
Kueri mode baris yang meminta ukuran peruntukan memori yang tidak mencukupi yang mengakibatkan tumpahan ke disk dapat terus mengalami masalah pada eksekusi berturut-turut. Kueri mode baris yang meminta ukuran peruntukan memori yang tidak mencukupi yang mengakibatkan tumpahan ke disk mungkin telah meningkatkan performa pada eksekusi berturut-turut. Untuk informasi selengkapnya, lihat memori mode baris memberikan umpan balik.
Kueri mode baris yang meminta ukuran pemberian memori berlebihan yang mengakibatkan masalah konkurensi dapat terus mengalami masalah pada eksekusi berturut-turut. Kueri mode baris yang meminta ukuran pemberian memori berlebihan yang mengakibatkan masalah konkurensi mungkin telah meningkatkan konkurensi pada eksekusi berturut-turut. Untuk informasi selengkapnya, lihat memori mode baris memberikan umpan balik.
Kueri yang mereferensikan UDF skalar T-SQL akan menggunakan pemanggilan berulang, kurangnya biaya, dan memaksa eksekusi serial. UDF skalar T-SQL diubah menjadi ekspresi relasional yang setara yang "inlined" ke dalam kueri pemanggilan, sering menghasilkan perolehan performa yang signifikan. Untuk informasi selengkapnya, lihat inlining UDF skalar T-SQL.
Variabel tabel menggunakan tebakan tetap untuk perkiraan kardinalitas. Jika jumlah baris aktual jauh lebih tinggi dari nilai yang ditebak, performa operasi hilir dapat menderita. Paket baru akan menggunakan kardinalitas aktual dari variabel tabel yang ditemui pada kompilasi pertama alih-alih tebakan tetap. Untuk informasi selengkapnya, lihat kompilasi yang ditangguhkan variabel tabel.

Untuk informasi selengkapnya tentang fitur pemrosesan kueri yang diaktifkan di tingkat kompatibilitas database 150, lihat Apa yang baru dalam pemrosesan kueri SQL Server 2019 dan Cerdas dalam database SQL.

Perbedaan antara tingkat kompatibilitas 130 dan tingkat 140

Bagian ini menjelaskan perilaku baru yang diperkenalkan dengan tingkat kompatibilitas 140.

Pengaturan tingkat kompatibilitas 130 atau lebih rendah Pengaturan tingkat kompatibilitas 140
Perkiraan kardinalitas untuk pernyataan yang mereferensikan fungsi bernilai tabel multi-pernyataan menggunakan tebakan baris tetap. Perkiraan kardinalitas untuk pernyataan yang memenuhi syarat yang mereferensikan fungsi bernilai tabel multi-pernyataan akan menggunakan kardinalitas aktual dari output fungsi. Ini diaktifkan melalui eksekusi interleaved untuk fungsi bernilai tabel multi-pernyataan.
Kueri mode batch yang meminta ukuran pemberian memori yang tidak mencukupi yang mengakibatkan tumpahan ke disk dapat terus mengalami masalah pada eksekusi berturut-turut. Kueri mode batch yang meminta ukuran pemberian memori yang tidak mencukupi yang mengakibatkan tumpahan ke disk mungkin telah meningkatkan performa pada eksekusi berturut-turut. Ini diaktifkan melalui umpan balik pemberian memori mode batch yang akan memperbarui ukuran peruntukan memori dari rencana yang di-cache jika tumpahan telah terjadi untuk operator mode batch.
Kueri mode batch yang meminta ukuran pemberian memori berlebihan yang mengakibatkan masalah konkurensi dapat terus mengalami masalah pada eksekusi berturut-turut. Kueri mode batch yang meminta ukuran pemberian memori berlebihan yang mengakibatkan masalah konkurensi mungkin telah meningkatkan konkurensi pada eksekusi berturut-turut. Ini diaktifkan melalui umpan balik pemberian memori mode batch yang akan memperbarui ukuran peruntukan memori dari rencana yang di-cache jika jumlah yang berlebihan awalnya diminta.
Kueri mode batch yang berisi operator gabungan memenuhi syarat untuk tiga algoritma gabungan fisik, termasuk perulangan berlapis, gabungan hash, dan gabungan gabungan. Jika perkiraan kardinalitas salah untuk input gabungan, algoritma gabungan yang tidak pantas dapat dipilih. Jika ini terjadi, performa akan menderita dan algoritma gabungan yang tidak pantas akan tetap digunakan sampai rencana yang di-cache disusun ulang. Ada operator gabungan tambahan yang disebut gabungan adaptif. Jika perkiraan kardinalitas salah untuk input gabungan build luar, algoritma gabungan yang tidak pantas dapat dipilih. Jika ini terjadi dan pernyataan memenuhi syarat untuk gabungan adaptif, perulangan berlapis akan digunakan untuk input gabungan yang lebih kecil dan gabungan hash akan digunakan untuk input gabungan yang lebih besar secara dinamis tanpa memerlukan kompilasi ulang.
Rencana sepele yang mereferensikan indeks Penyimpan kolom tidak memenuhi syarat untuk eksekusi mode batch. Rencana sepele yang mereferensikan indeks Penyimpan kolom akan dibuang demi rencana yang memenuhi syarat untuk eksekusi mode batch.
Operator sp_execute_external_script UDX hanya dapat berjalan dalam mode baris. Operator sp_execute_external_script UDX memenuhi syarat untuk eksekusi mode batch.
Fungsi bernilai tabel multi-pernyataan (TVF) tidak memiliki eksekusi interleaved Eksekusi interleaved untuk TVF multi-pernyataan untuk meningkatkan kualitas rencana.

Perbaikan yang berada di bawah bendera pelacakan 4199 di versi SQL Server sebelumnya sebelum SQL Server 2017 sekarang diaktifkan secara default. Dengan mode kompatibilitas 140. Bendera pelacakan 4199 masih akan berlaku untuk perbaikan pengoptimal kueri baru yang dirilis setelah SQL Server 2017. Untuk informasi tentang Bendera Pelacakan 4199, lihat Bendera Pelacakan 4199.

Perbedaan antara tingkat kompatibilitas 120 dan tingkat 130

Bagian ini menjelaskan perilaku baru yang diperkenalkan dengan tingkat kompatibilitas 130.

Pengaturan tingkat kompatibilitas 120 atau lebih rendah Pengaturan tingkat kompatibilitas 130
INSERT dalam pernyataan INSERT-SELECT berutas tunggal. INSERT dalam pernyataan INSERT-SELECT multi-utas atau dapat memiliki rencana paralel.
Kueri pada tabel yang dioptimalkan memori menjalankan utas tunggal. Kueri pada tabel yang dioptimalkan memori sekarang dapat memiliki rencana paralel.
Memperkenalkan estimator Kardinalitas SQL 2014 KardinalitasEstimasiModelVersion="120" Peningkatan estimasi kardinalitas lebih lanjut (CE) dengan Model Estimasi Kardinalitas 130 yang terlihat dari rencana Kueri. KardinalitasEstimasiModelVersion="130"
Mode batch versus Mode Baris berubah dengan indeks Penyimpan Kolom:
  • Mengurutkan pada tabel dengan indeks Penyimpan Kolom berada dalam mode Baris
  • Agregat fungsi windowing beroperasi dalam mode baris seperti LAG atau LEAD
  • Kueri pada tabel Penyimpan Kolom dengan Beberapa klausa berbeda yang dioperasikan dalam mode Baris
  • Kueri yang berjalan di bawah MAXDOP 1 atau dengan rencana serial yang dijalankan dalam mode Baris
Mode batch versus Mode Baris berubah dengan indeks Penyimpan Kolom:
  • Mengurutkan pada tabel dengan indeks Penyimpan Kolom sekarang dalam mode batch
  • Agregat windowing sekarang beroperasi dalam mode batch seperti LAG atau LEAD
  • Kueri pada tabel Columnstore dengan Beberapa klausa berbeda beroperasi dalam mode Batch
  • Kueri yang berjalan di bawah MAXDOP 1 atau dengan rencana serial dijalankan dalam Mode Batch
Statistik dapat diperbarui secara otomatis. Logika yang secara otomatis memperbarui statistik lebih agresif pada tabel besar. Dalam praktiknya, ini harus mengurangi kasus di mana pelanggan telah melihat masalah performa pada kueri di mana baris yang baru disisipkan sering dikueri tetapi di mana statistik belum diperbarui untuk menyertakan nilai-nilai tersebut.
Trace 2371 NONAKTIF secara default di SQL Server 2014 (12.x). Jejak 2371 AKTIF secara default di SQL Server 2016 (13.x). Bendera pelacakan 2371 memberi tahu updater statistik otomatis untuk mengambil sampel subset baris yang lebih kecil namun lebih bijaksana, dalam tabel yang memiliki banyak baris.

Salah satu peningkatannya adalah menyertakan dalam sampel lebih banyak baris yang disisipkan baru-baru ini.

Peningkatan lain adalah membiarkan kueri berjalan saat proses statistik pembaruan berjalan, daripada memblokir kueri.
Untuk tingkat 120, statistik diambil sampelnya oleh proses utas tunggal. Untuk tingkat 130, statistik diambil sampelnya oleh proses multi-utas (proses paralel).
253 kunci asing yang masuk adalah batasnya. Tabel tertentu dapat dirujuk hingga 10.000 kunci asing masuk atau referensi serupa. Untuk pembatasan, lihat Membuat Hubungan Kunci Asing.
Algoritma hash MD2, MD4, MD5, SHA, dan SHA1 yang tidak digunakan lagi diizinkan. Hanya algoritma hash SHA2_256 dan SHA2_512 yang diizinkan.
SQL Server 2016 (13.x) mencakup peningkatan dalam beberapa konversi jenis data dan beberapa operasi (sebagian besar tidak jarang). Untuk detailnya lihat peningkatan SQL Server 2016 dalam menangani beberapa jenis data dan operasi yang tidak biasa.
Fungsi STRING_SPLIT ini tidak tersedia. Fungsi STRING_SPLIT ini tersedia di bawah tingkat kompatibilitas 130 atau lebih tinggi. Jika tingkat kompatibilitas database Anda lebih rendah dari 130, SQL Server tidak akan dapat menemukan dan menjalankan STRING_SPLIT fungsi.

Perbaikan yang berada di bawah bendera pelacakan 4199 dalam versi SQL Server sebelumnya sebelum SQL Server 2016 (13.x) sekarang diaktifkan secara default. Dengan mode kompatibilitas 130. Bendera pelacakan 4199 masih akan berlaku untuk perbaikan pengoptimal kueri baru yang dirilis setelah SQL Server 2016 (13.x). Untuk menggunakan pengoptimal kueri yang lebih lama di SQL Database Anda harus memilih tingkat kompatibilitas 110. Untuk informasi tentang Bendera Pelacakan 4199, lihat Bendera Pelacakan 4199.

Perbedaan antara tingkat kompatibilitas yang lebih rendah dan tingkat 120

Bagian ini menjelaskan perilaku baru yang diperkenalkan dengan tingkat kompatibilitas 120.

Pengaturan tingkat kompatibilitas 110 atau lebih rendah Pengaturan tingkat kompatibilitas 120
Pengoptimal kueri yang lebih lama digunakan. SQL Server 2014 (12.x) mencakup peningkatan substansial pada komponen yang membuat dan mengoptimalkan rencana kueri. Fitur pengoptimal kueri baru ini bergantung pada penggunaan tingkat kompatibilitas database 120. Aplikasi database baru harus dikembangkan menggunakan tingkat kompatibilitas database 120 untuk memanfaatkan peningkatan ini. Aplikasi yang dimigrasikan dari versi SQL Server sebelumnya harus diuji dengan hati-hati untuk mengonfirmasi bahwa performa yang baik dipertahankan atau ditingkatkan. Jika performa terdegradasi, Anda dapat mengatur tingkat kompatibilitas database ke 110 atau yang lebih lama untuk menggunakan metodologi pengoptimal kueri yang lebih lama.

Tingkat kompatibilitas database 120 menggunakan estimator kardinalitas baru yang disetel untuk pergudangan data modern dan beban kerja OLTP. Sebelum mengatur tingkat kompatibilitas database ke 110 karena masalah performa, lihat rekomendasi di bagian Rencana Kueri dari artikel Apa yang Baru dalam Mesin Database SQL Server 2014 (12.x).
Dalam tingkat kompatibilitas yang lebih rendah dari 120, pengaturan bahasa diabaikan saat mengonversi nilai tanggal menjadi nilai string. Perhatikan bahwa perilaku ini hanya khusus untuk jenis tanggal . Lihat contoh B di bagian Contoh di bawah ini. Pengaturan bahasa tidak diabaikan saat mengonversi nilai tanggal menjadi nilai string.
Referensi rekursif di sisi EXCEPT kanan klausa membuat perulangan tak terbatas. Contoh C di bagian Contoh di bawah ini menunjukkan perilaku ini. Referensi rekursif dalam EXCEPT klausul menghasilkan kesalahan sesuai dengan standar ANSI SQL.
Ekspresi tabel umum rekursif (CTE) memungkinkan nama kolom duplikat. CTE rekursif tidak mengizinkan nama kolom duplikat.
Pemicu yang dinonaktifkan diaktifkan jika pemicu diubah. Mengubah pemicu tidak mengubah status (diaktifkan atau dinonaktifkan) pemicu.
Klausa IDENTITY_INSERT SETTING = OFF tabel OUTPUT INTO mengabaikan dan memungkinkan nilai eksplisit disisipkan. Anda tidak dapat menyisipkan nilai eksplisit untuk kolom identitas dalam tabel saat IDENTITY_INSERT diatur ke NONAKTIF.
Saat penahanan database diatur ke parsial, memvalidasi $action bidang dalam OUTPUT klausa MERGE pernyataan dapat mengembalikan kesalahan kolase. Kolase nilai yang dikembalikan oleh $action klausul MERGE pernyataan adalah kolase database alih-alih kolase server dan kesalahan konflik kolase tidak dikembalikan.
Pernyataan SELECT INTO selalu membuat operasi penyisipan satu alur. Pernyataan SELECT INTO dapat membuat operasi penyisipan paralel. Saat menyisipkan sejumlah besar baris, operasi paralel dapat meningkatkan performa.

Perbedaan antara tingkat kompatibilitas yang lebih rendah dan tingkat 100 dan 110

Bagian ini menjelaskan perilaku baru yang diperkenalkan dengan tingkat kompatibilitas 110. Bagian ini juga berlaku untuk tingkat kompatibilitas di atas 110.

Pengaturan tingkat kompatibilitas 100 atau lebih rendah Pengaturan tingkat kompatibilitas setidaknya 110
Objek database runtime bahasa umum (CLR) dijalankan dengan versi 4 dari CLR. Namun, beberapa perubahan perilaku yang diperkenalkan di versi 4 CLR dihindari. Untuk informasi selengkapnya, lihat Apa yang Baru dalam Integrasi CLR. Objek database CLR dijalankan dengan versi 4 dari CLR.
Fungsi XQuery panjang string dan substring menghitung setiap pengganti sebagai dua karakter. Fungsi XQuery panjang string dan substring menghitung setiap pengganti sebagai satu karakter.
PIVOT diizinkan dalam kueri ekspresi tabel umum (CTE) rekursif. Namun, kueri mengembalikan hasil yang salah ketika ada beberapa baris per pengelompokan. PIVOT tidak diperbolehkan dalam kueri ekspresi tabel umum (CTE) rekursif. Kesalahan dikembalikan.
Algoritma RC4 hanya didukung untuk kompatibilitas mundur. Materi baru hanya dapat dienkripsi menggunakan RC4 atau RC4_128 ketika database berada dalam tingkat kompatibilitas 90 atau 100. (Tidak disarankan.) Dalam SQL Server 2012 (11.x), materi yang dienkripsi menggunakan RC4 atau RC4_128 dapat didekripsi dalam tingkat kompatibilitas apa pun. Materi baru tidak dapat dienkripsi menggunakan RC4 atau RC4_128. Gunakan algoritma yang lebih baru seperti salah satu algoritma AES sebagai gantinya. Dalam SQL Server 2012 (11.x), materi yang dienkripsi menggunakan RC4 atau RC4_128 dapat didekripsi dalam tingkat kompatibilitas apa pun.
Gaya default untuk CAST operasi dan CONVERT pada jenis data waktu dan tanggalwaktu2 adalah 121 kecuali saat salah satu jenis digunakan dalam ekspresi kolom komputasi. Untuk kolom komputasi, gaya defaultnya adalah 0. Perilaku ini berdampak pada kolom komputasi saat dibuat, digunakan dalam kueri yang melibatkan parameterisasi otomatis, atau digunakan dalam definisi batasan.

Contoh D di bagian Contoh di bawah ini memperlihatkan perbedaan antara gaya 0 dan 121. Ini tidak menunjukkan perilaku yang dijelaskan di atas. Untuk informasi selengkapnya tentang gaya tanggal dan waktu, lihat CAST dan CONVERT.
Di bawah tingkat kompatibilitas 110, gaya default untuk CAST operasi dan CONVERT pada waktu dan jenis data datetime2 selalu 121. Jika kueri Anda bergantung pada perilaku lama, gunakan tingkat kompatibilitas kurang dari 110, atau tentukan gaya 0 secara eksplisit dalam kueri yang terpengaruh.

Meningkatkan database ke tingkat kompatibilitas 110 tidak akan mengubah data pengguna yang telah disimpan ke disk. Anda harus memperbaiki data ini secara manual sebagaimana mestinya. Misalnya, jika Anda menggunakan SELECT INTO untuk membuat tabel dari sumber yang berisi ekspresi kolom komputasi yang dijelaskan di atas, data (menggunakan gaya 0) akan disimpan daripada definisi kolom komputasi itu sendiri. Anda perlu memperbarui data ini secara manual agar sesuai dengan gaya 121.
Operator + (Penambahan) dapat diterapkan ke operand jenis tanggal, waktu, datetime2, atau datetimeoffset jika operand lain memiliki jenis datetime atau smalldatetime. Mencoba menerapkan operator penambahan ke operan jenis tanggal, waktu, datetime2, atau datetimeoffset dan operand jenis datetime atau smalldatetime akan menyebabkan kesalahan 402.
Setiap kolom dalam tabel jarak jauh jenis smalldatetime yang direferensikan dalam tampilan yang dipartisi dipetakan sebagai tanggalwaktu. Kolom terkait dalam tabel lokal (dalam posisi ordinal yang sama dalam daftar pilih) harus berjenis tanggalwaktu. Setiap kolom dalam tabel jarak jauh jenis smalldatetime yang direferensikan dalam tampilan yang dipartisi dipetakan sebagai smalldatetime. Kolom terkait dalam tabel lokal (dalam posisi ordinal yang sama dalam daftar pilih) harus berjenis smalldatetime.

Setelah memutakhirkan ke 110, tampilan terpartisi terdistribusi akan gagal karena ketidakcocokan jenis data. Anda dapat mengatasinya dengan mengubah jenis data pada tabel jarak jauh ke tanggalwaktu atau mengatur tingkat kompatibilitas database lokal menjadi 100 atau lebih rendah.
SOUNDEX fungsi mengimplementasikan aturan berikut:

1) Huruf besar H atau huruf besar W diabaikan saat memisahkan dua konsonan yang memiliki angka yang sama dalam SOUNDEX kode.

2) Jika 2 karakter pertama character_expression memiliki angka yang sama dalam SOUNDEX kode, kedua karakter disertakan. Jika tidak, jika sekumpulan konsonan berdampingan memiliki angka yang sama dalam SOUNDEX kode, semuanya dikecualikan kecuali yang pertama.
SOUNDEX fungsi mengimplementasikan aturan berikut:

1) Jika H huruf besar atau huruf besar W memisahkan dua konsonan yang memiliki angka yang sama dalam SOUNDEX kode, konsonan di sebelah kanan diabaikan

2) Jika sekumpulan konsonan berdampingan memiliki angka yang sama dalam SOUNDEX kode, semuanya dikecualikan kecuali yang pertama.



Aturan tambahan dapat menyebabkan nilai yang dihitung oleh SOUNDEX fungsi berbeda dari nilai yang dihitung di bawah tingkat kompatibilitas sebelumnya. Setelah meningkatkan ke tingkat kompatibilitas 110, Anda mungkin perlu membangun kembali indeks, tumpukan, atau batasan CHECK yang menggunakan fungsi .SOUNDEX Untuk informasi selengkapnya, lihat SOUNDEX.
STRING_AGG tersedia tanpa <order_clause>. STRING_AGG tersedia dengan opsional <order_clause>. Untuk informasi selengkapnya, lihat STRING_AGG

Perbedaan antara tingkat kompatibilitas 90 dan tingkat 100

Bagian ini menjelaskan perilaku baru yang diperkenalkan dengan tingkat kompatibilitas 100.

Pengaturan tingkat kompatibilitas 90 Pengaturan tingkat kompatibilitas 100 Kemungkinan dampak
Pengaturan QUOTED_IDENTIFER selalu diatur ke AKTIF untuk fungsi bernilai tabel multistatement saat dibuat terlepas dari pengaturan tingkat sesi. Pengaturan sesi QUOTED IDENTIFIER dihormati saat fungsi bernilai tabel multistatement dibuat. Medium
Saat Anda membuat atau mengubah fungsi partisi, literal datetime dan smalldatetime dalam fungsi dievaluasi dengan asumsi US_English sebagai pengaturan bahasa. Pengaturan bahasa saat ini digunakan untuk mengevaluasi harfiah tanggalwaktu dan smalldatetime dalam fungsi partisi. Medium
Klausa FOR BROWSE diperbolehkan (dan diabaikan) dalam INSERT pernyataan dan SELECT INTO . Klausa FOR BROWSE tidak diizinkan dalam INSERT pernyataan dan SELECT INTO . Medium
Predikat teks lengkap diperbolehkan dalam OUTPUT klausul . Predikat teks lengkap tidak diperbolehkan dalam OUTPUT klausul. Rendah
CREATE FULLTEXT STOPLIST, ALTER FULLTEXT STOPLIST, dan DROP FULLTEXT STOPLIST tidak didukung. Daftar henti sistem secara otomatis dikaitkan dengan indeks teks lengkap baru. CREATE FULLTEXT STOPLIST, ALTER FULLTEXT STOPLIST, dan DROP FULLTEXT STOPLIST didukung. Rendah
MERGE tidak diberlakukan sebagai kata kunci yang dipesan. MERGE adalah kata kunci yang sepenuhnya dicadangkan. Pernyataan MERGE ini didukung di bawah tingkat kompatibilitas 100 dan 90. Rendah
<Menggunakan argumen dml_table_source> dari pernyataan INSERT menimbulkan kesalahan sintaks. Anda dapat mengambil hasil klausa OUTPUT dalam pernyataan INSERT, UPDATE, DELETE, atau MERGE bertumpuk, dan menyisipkan hasil tersebut ke dalam tabel atau tampilan target. Ini dilakukan menggunakan <argumen dml_table_source> dari pernyataan INSERT. Rendah
Kecuali NOINDEX ditentukan, DBCC CHECKDB atau DBCC CHECKTABLE melakukan pemeriksaan konsistensi fisik dan logis pada satu tabel atau tampilan terindeks dan pada semua indeks non-kluster dan XML-nya. Indeks spasial tidak didukung. Kecuali NOINDEX ditentukan, DBCC CHECKDB atau DBCC CHECKTABLE melakukan pemeriksaan konsistensi fisik dan logis pada satu tabel dan pada semua indeks non-klusternya. Namun, pada indeks XML, indeks spasial, dan tampilan terindeks, hanya pemeriksaan konsistensi fisik yang dilakukan secara default.

Jika WITH EXTENDED_LOGICAL_CHECKS ditentukan, pemeriksaan logis dilakukan pada tampilan terindeks, indeks XML, dan indeks spasial, jika ada. Secara default, pemeriksaan konsistensi fisik dilakukan sebelum pemeriksaan konsistensi logis. Jika NOINDEX juga ditentukan, hanya pemeriksaan logis yang dilakukan.
Rendah
Ketika klausa OUTPUT digunakan dengan pernyataan bahasa manipulasi data (DML) dan kesalahan run-time terjadi selama eksekusi pernyataan, seluruh transaksi dihentikan dan digulung balik. OUTPUT Ketika klausul digunakan dengan pernyataan bahasa manipulasi data (DML) dan kesalahan run-time terjadi selama eksekusi pernyataan, perilaku tergantung pada SET XACT_ABORT pengaturan. Jika SET XACT_ABORT NONAKTIF, kesalahan pembatalan pernyataan yang dihasilkan oleh pernyataan DML menggunakan OUTPUT klausul akan mengakhiri pernyataan, tetapi eksekusi batch berlanjut dan transaksi tidak digulung balik. Jika SET XACT_ABORT ON, semua kesalahan run-time yang dihasilkan oleh pernyataan DML menggunakan klausa OUTPUT akan mengakhiri batch, dan transaksi digulung balik. Rendah
CUBE dan ROLLUP tidak diberlakukan sebagai kata kunci yang dipesan. CUBE dan ROLLUP merupakan kata kunci yang dicadangkan dalam klausul GROUP BY. Rendah
Validasi ketat diterapkan ke elemen jenis XML anyType . Validasi lax diterapkan ke elemen dari jenis anyType . Untuk informasi selengkapnya, lihat Komponen Wildcard dan Validasi Konten. Rendah
Atribut khusus xsi:nil dan xsi:type tidak dapat dikueri atau dimodifikasi oleh pernyataan bahasa manipulasi data.

Ini berarti bahwa /e/@xsi:nil gagal saat /e/@* mengabaikan atribut xsi:nil dan xsi:type . Namun, /e mengembalikan atribut xsi:nil dan xsi:type untuk konsistensi dengan SELECT xmlCol, bahkan jika xsi:nil = "false".
Atribut khusus xsi:nil dan xsi:type disimpan sebagai atribut reguler dan dapat dikueri dan dimodifikasi.

Misalnya, menjalankan kueri SELECT x.query('a/b/@*') mengembalikan semua atribut termasuk xsi:nil dan xsi:type. Untuk mengecualikan jenis ini dalam kueri, ganti @* dengan @*[namespace-uri(.) != "menyisipkan uri" namespace xsi dan bukan (local-name(.) = "type" atau local-name(.) ="nil".
Rendah
Fungsi yang ditentukan pengguna yang mengonversi nilai string konstanta XML menjadi jenis tanggalwaktu SQL Server ditandai sebagai deterministik. Fungsi yang ditentukan pengguna yang mengonversi nilai string konstanta XML menjadi jenis tanggalwaktu SQL Server ditandai sebagai non-deterministik. Rendah
Union XML dan jenis daftar tidak didukung sepenuhnya. Jenis serikat dan daftar didukung sepenuhnya termasuk fungsionalitas berikut:

Persatuan daftar

Persatuan serikat

Daftar jenis atomik

Daftar serikat
Rendah
Opsi SET yang diperlukan untuk metode xQuery tidak divalidasi saat metode terkandung dalam tampilan atau fungsi bernilai tabel sebaris. Opsi SET yang diperlukan untuk metode xQuery divalidasi saat metode terkandung dalam tampilan atau fungsi bernilai tabel sebaris. Kesalahan dimunculkan jika opsi SET metode diatur dengan tidak benar. Rendah
Nilai atribut XML yang berisi karakter akhir baris (pengembalian pengangkutan dan umpan baris) tidak dinormalisasi sesuai dengan standar XML. Artinya, kedua karakter dikembalikan alih-alih satu karakter umpan baris. Nilai atribut XML yang berisi karakter akhir baris (pengembalian pengangkutan dan umpan baris) dinormalisasi sesuai dengan standar XML. Artinya, semua hentian baris dalam entitas eksternal yang diurai (termasuk entitas dokumen) dinormalisasi pada input dengan menerjemahkan urutan dua karakter #xD #xA dan #xD apa pun yang tidak diikuti oleh #xA ke satu karakter #xA.

Aplikasi yang menggunakan atribut untuk mengangkut nilai string yang berisi karakter akhir baris tidak akan menerima karakter ini kembali saat dikirimkan. Untuk menghindari proses normalisasi, gunakan entitas karakter numerik XML untuk mengodekan semua karakter akhir baris.
Rendah
Properti ROWGUIDCOL kolom dan IDENTITY bisa salah dinamai sebagai batasan. Misalnya pernyataan CREATE TABLE T (C1 int CONSTRAINT MyConstraint IDENTITY) dijalankan, tetapi nama batasan tidak dipertahankan dan tidak dapat diakses oleh pengguna. Properti ROWGUIDCOL kolom dan IDENTITY tidak dapat dinamai sebagai batasan. Kesalahan 156 dikembalikan. Rendah
Memperbarui kolom dengan menggunakan penetapan dua arah seperti UPDATE T1 SET @v = column_name = <expression> dapat menghasilkan hasil yang tidak terduga karena nilai langsung variabel dapat digunakan dalam klausul lain seperti WHERE klausul dan ON selama eksekusi pernyataan alih-alih nilai awal pernyataan. Hal ini dapat menyebabkan makna predikat berubah tanpa diduga secara per baris.

Perilaku ini hanya berlaku ketika tingkat kompatibilitas diatur ke 90.
Memperbarui kolom dengan menggunakan penetapan dua arah menghasilkan hasil yang diharapkan karena hanya nilai awal pernyataan kolom yang diakses selama eksekusi pernyataan. Rendah
Penetapan variabel diizinkan dalam pernyataan yang berisi operator UNION tingkat atas, tetapi mengembalikan hasil yang tidak terduga. Pelajari selengkapnya dalam contoh E. Penetapan variabel tidak diperbolehkan dalam pernyataan yang berisi operator UNION tingkat atas. Kesalahan 10734 dikembalikan. Temukan penulisan ulang yang disarankan dalam contoh E. Rendah
Fungsi ODBC {fn CONVERT()} menggunakan format tanggal default bahasa. Untuk beberapa bahasa, format defaultnya adalah YDM, yang dapat mengakibatkan kesalahan konversi ketika CONVERT() dikombinasikan dengan fungsi lain, seperti {fn CURDATE()}, yang mengharapkan format YMD. Fungsi ODBC {fn CONVERT()} menggunakan gaya 121 (format YMD independen bahasa) saat mengonversi ke jenis data ODBC SQL_TIMESTAMP, SQL_DATE, SQL_TIME, SQLDATE, SQL_TYPE_TIME, dan SQL_TYPE_TIMESTAMP. Rendah
Intrinsik tanggalwaktu seperti DATEPART tidak memerlukan nilai input string menjadi literal tanggalwaktu yang valid. Misalnya, SELECT DATEPART (year, '2007/05-30') berhasil mengkompilasi. Intrinsik tanggalwaktu seperti DATEPART mengharuskan nilai input string menjadi harfiah tanggalwaktu yang valid. Kesalahan 241 dikembalikan ketika harfiah tanggalwaktu yang tidak valid digunakan. Rendah
Spasi berikutnya yang ditentukan dalam parameter input pertama ke fungsi REPLACE dipangkas ketika parameter berjenis karakter. Misalnya, dalam pernyataan SELECT '<' + REPLACE(CONVERT(char(6), 'ABC '), ' ' ' L') + '>', nilai 'ABC ' salah dievaluasi sebagai 'ABC'. Spasi berikutnya selalu dipertahankan. Untuk aplikasi yang mengandalkan perilaku fungsi sebelumnya, gunakan fungsi RTRIM saat menentukan parameter input pertama untuk fungsi tersebut. Misalnya, sintaks berikut akan mereproduksi perilaku SQL Server 2005 SELECT '<' + REPLACE(RTRIM(CONVERT(char(6), 'ABC ')), ' ', 'L') + '>'. Rendah

Kata kunci yang dicadangkan

Pengaturan kompatibilitas juga menentukan kata kunci yang dicadangkan oleh Mesin Database. Tabel berikut ini memperlihatkan kata kunci yang dipesan yang diperkenalkan oleh setiap tingkat kompatibilitas.

Pengaturan tingkat kompatibilitas Kata kunci yang dicadangkan
130 Untuk ditentukan.
120 Tidak ada.
110 WITHIN GROUP, TRY_CONVERT, SEMANTICKEYPHRASETABLE, SEMANTICSIMILARITYDETAILSTABLE, SEMANTICSIMILARITYTABLE
100 CUBE, MERGE, ROLLUP
90 EXTERNAL, PIVOT, UNPIVOT, REVERT, TABLESAMPLE

Pada tingkat kompatibilitas tertentu, kata kunci yang dipesan mencakup semua kata kunci yang diperkenalkan pada atau di bawah tingkat tersebut. Dengan demikian, misalnya, untuk aplikasi pada tingkat 110, semua kata kunci yang tercantum dalam tabel sebelumnya dicadangkan. Pada tingkat kompatibilitas yang lebih rendah, kata kunci level-100 tetap valid nama objek, tetapi fitur bahasa tingkat 110 yang sesuai dengan kata kunci tersebut tidak tersedia.

Setelah diperkenalkan, kata kunci tetap dicadangkan. Misalnya, pivot kata kunci yang dipesan, yang diperkenalkan dalam tingkat kompatibilitas 90, juga dicadangkan dalam level 100, 110, dan 120.

Jika aplikasi menggunakan pengidentifikasi yang dicadangkan sebagai kata kunci untuk tingkat kompatibilitasnya, aplikasi akan gagal. Untuk mengatasi hal ini, sertakan pengidentifikasi antara tanda kurung siku ([]) atau tanda kutip (""); misalnya, untuk meningkatkan aplikasi yang menggunakan pengidentifikasi EXTERNAL ke tingkat kompatibilitas 90, Anda dapat mengubah pengidentifikasi menjadi atau [EXTERNAL]"EXTERNAL".

Untuk informasi selengkapnya, lihat Kata Kunci Yang Dipesan.

Izin

ALTER Memerlukan izin pada database.

Contoh

A. Mengubah tingkat kompatibilitas

Contoh berikut mengubah tingkat kompatibilitas database sampelAdventureWorks2019 menjadi 150, default untuk SQL Server 2019 (15.x).

ALTER DATABASE AdventureWorks2019
SET COMPATIBILITY_LEVEL = 150;
GO

Contoh berikut mengembalikan tingkat kompatibilitas database saat ini.

SELECT name, compatibility_level
FROM sys.databases
WHERE name = db_name();
GO

B. Abaikan pernyataan SET LANGUAGE kecuali di bawah tingkat kompatibilitas 120 atau lebih tinggi

Kueri berikut mengabaikan SET LANGUAGE pernyataan kecuali di bawah tingkat kompatibilitas 120 atau lebih tinggi.

SET DATEFORMAT dmy;
DECLARE @t2 date = '12/5/2011' ;
SET LANGUAGE dutch;
SELECT CONVERT(varchar(11), @t2, 106);
GO

Hasil ketika tingkat kompatibilitas kurang dari 120: 12 May 2011

Hasil saat tingkat kompatibilitas diatur ke 120 atau lebih tinggi: 12 mei 2011

C. Untuk pengaturan tingkat kompatibilitas 110 atau lebih rendah, referensi rekursif di sisi kanan klausa EXCEPT membuat perulangan tak terbatas

WITH cte AS 
    (SELECT * FROM (VALUES (1),(2),(3)) v (a)),
r AS 
    (SELECT a FROM cte
    UNION ALL
    (SELECT a FROM cte EXCEPT SELECT a FROM r) 
)
SELECT a
FROM r;
GO

D. Perbedaan antara gaya 0 dan 121

Saat tingkat kompatibilitas lebih rendah dari 110, gaya default untuk CAST dan CONVERT operasi pada jenis data waktu dan datetime2 adalah 121 kecuali ketika salah satu jenis digunakan dalam ekspresi kolom komputasi. Untuk kolom komputasi, gaya defaultnya adalah 0.

Ketika tingkat kompatibilitas adalah 110 atau lebih tinggi, gaya default untuk CAST dan CONVERT operasi pada jenis data waktu dan tanggalwaktu2 selalu 121. Lihat Perbedaan antara tingkat kompatibilitas yang lebih rendah dan tingkat 100 dan 110 untuk informasi selengkapnya.

Untuk informasi selengkapnya tentang gaya tanggal dan waktu, lihat CAST dan CONVERT.

DROP TABLE IF EXISTS t1;
GO

CREATE TABLE t1 (c1 time(7), c2 datetime2);
GO

INSERT t1 (c1,c2) VALUES (GETDATE(), GETDATE());
GO

SELECT CONVERT(nvarchar(16),c1,0) AS TimeStyle0
       ,CONVERT(nvarchar(16),c1,121)AS TimeStyle121
       ,CONVERT(nvarchar(32),c2,0) AS Datetime2Style0
       ,CONVERT(nvarchar(32),c2,121)AS Datetime2Style121
FROM t1;
GO

Ini mengembalikan hasil seperti berikut ini:

TimeStyle0 TimeStyle121 Datetime2Style0 Datetime2Style121
15.15 15:15:35.8100000 7 Jun 2011 15:15 2011-06-07 15:15:35.8130000

E. Penetapan variabel - operator UNION tingkat atas

Di bawah pengaturan tingkat kompatibilitas database 90, penetapan variabel diizinkan dalam pernyataan yang berisi operator UNION tingkat atas, tetapi mengembalikan hasil yang tidak terduga. Misalnya, dalam pernyataan berikut, variabel @v lokal diberi nilai kolom BusinessEntityID dari penyatuan dua tabel. Menurut definisi, ketika pernyataan SELECT mengembalikan lebih dari satu nilai, variabel diberi nilai terakhir yang dikembalikan. Dalam hal ini, variabel diberi nilai terakhir dengan benar, namun, kumpulan hasil pernyataan SELECT UNION juga dikembalikan.

ALTER DATABASE AdventureWorks2012
SET compatibility_level = 110;
GO
USE AdventureWorks2012;
GO
DECLARE @v int;
SELECT @v = BusinessEntityID FROM HumanResources.Employee
UNION ALL
SELECT @v = BusinessEntityID FROM HumanResources.EmployeeAddress;
SELECT @v;

Di bawah pengaturan tingkat kompatibilitas database 100 dan lebih tinggi, penetapan variabel tidak diizinkan dalam pernyataan yang berisi operator UNION tingkat atas. Kesalahan 10734 dikembalikan.

Untuk mengatasi kesalahan, tulis ulang kueri seperti yang diperlihatkan dalam contoh berikut.

DECLARE @v int;
SELECT @v = BusinessEntityID FROM
    (SELECT BusinessEntityID FROM HumanResources.Employee
     UNION ALL
     SELECT BusinessEntityID FROM HumanResources.EmployeeAddress) AS Test;
SELECT @v;

Langkah berikutnya

Untuk informasi selengkapnya tentang tingkat kompatibilitas database dan konsep terkait, lihat artikel berikut ini: