Bagikan melalui


MSSQLSERVER_2570

Berlaku untuk: SQL Server

Detail

Atribut Nilai
Nama Produk SQL Server
ID Peristiwa 2570
Sumber Kejadian MSSQLSERVER
Komponen SQLEngine
Nama Simbolis DBCC_COLUMN_VALUE_OUT_OF_RANGE
Teks Pesan P_ID halaman, S_ID slot di O_ID ID objek, I_ID ID indeks, PN_ID ID partisi, id unit alokasi A_ID (jenis JENIS). Nilai COLUMN_NAME kolom berada di luar rentang untuk tipe data "DATATYPE". Perbarui kolom ke nilai hukum.

Penjelasan

Nilai kolom yang terkandung dalam kolom yang ditentukan berada di luar rentang nilai yang mungkin untuk jenis data kolom. Jika Anda memiliki data yang tidak valid dalam kolom tabel, Anda mungkin mengalami masalah, tergantung pada jenis operasi yang dilakukan terhadap data yang tidak valid. Namun, ada kemungkinan juga bahwa tidak ada masalah yang akan muncul, dan data yang tidak valid tidak akan ditemukan sampai Anda menjalankan DBCC CHECKDB perintah atau DBCC CHECKTABLE .

Beberapa gejala yang mungkin Anda perhatikan karena adanya data yang tidak valid termasuk (tetapi tidak terbatas pada):

  • Pelanggaran akses atau pengecualian lainnya saat menjalankan kueri terhadap kolom yang terpengaruh.
  • Hasil yang salah dikembalikan oleh kueri yang dijalankan terhadap kolom yang terpengaruh.
  • Kesalahan atau masalah saat statistik sedang dibangun terhadap kolom yang terpengaruh.
  • Pesan kesalahan seperti berikut ini:

    Msg 9100, Level 23, State 2, LineNum LineNum <> Kemungkinan kerusakan indeks terdeteksi. Jalankan DBCC CHECKDB.

pemeriksaan DATA_PURITY

Saat Anda menjalankan perintah DBCC CHECKDB atau DBCC CHECKTABLE , SQL Server melakukan validasi "kemurnian data" nilai kolom di setiap baris setiap tabel dalam database. Pemeriksaan ini dilakukan untuk memastikan bahwa nilai yang disimpan dalam kolom valid. Artinya, validasi memastikan nilai tidak di luar rentang domain yang terkait dengan jenis data kolom. Sifat validasi yang dilakukan tergantung pada jenis data kolom. Daftar non-lengkap berikut memberikan beberapa contoh:

Jenis data kolom Jenis validasi data yang dilakukan
Karakter Unicode Panjang data harus kelipatan 2.
Tanggalwaktu Bidang tanggal harus antara 1 Januari 1753 dan 31 Desember 9999. Bidang waktu harus lebih awal dari "11:59:59.997PM."
Nyata dan Mengambang Periksa keberadaan nilai floating-point yang tidak valid seperti SNAN, QNAN, NINF, ND, PD, dan PINF.

Tidak semua jenis data diperiksa untuk validitas data kolom. Hanya mereka yang mungkin memiliki nilai tersimpan di luar rentang yang diperiksa. Misalnya, tinyint jenis data memiliki rentang 0 hingga 255 yang valid dan disimpan dalam satu byte (yang hanya dapat menyimpan nilai antara 0 dan 255), jadi memeriksa nilai tidak diperlukan.

Catatan

Pemeriksaan ini diaktifkan secara default dan tidak dapat dinonaktifkan, jadi tidak perlu secara eksplisit menggunakan opsi DATA_PURITY saat menjalankan DBCC CHECKDB perintah atau DBCC CHECKTABLE . Namun, jika Anda menggunakan opsi PHYSICAL_ONLY dengan DBCC CHECKDB atau DBCC CHECKTABLE, pemeriksaan kemurnian data tidak dilakukan.

laporan masalah DATA_PURITY

Saat Anda menjalankan DBCC CHECKDB perintah atau DBCC CHECKTABLE dengan DATA_PURITY opsi diaktifkan (atau pemeriksaan kemurnian data dijalankan secara otomatis), dan data yang tidak valid ada dalam tabel yang diperiksa oleh DBCC perintah, DBCC output akan menyertakan pesan lain yang menunjukkan masalah yang terkait dengan data. Contoh pesan kesalahan berikut menunjukkan masalah kemurnian data:

DBCC results for "account_history". 
Msg 2570, Level 16, State 2, Line <LineNum> 
Page (1:1073), slot 33 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "account_name" value is out of range for data type "nvarchar". Update column to a legal value. 
 
Msg 2570, Level 16, State 2, Line <LineNum> 
Page (1:1156), slot 120 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "account_name" value is out of range for data type "nvarchar". Update column to a legal value.
There are 153137 rows in 1080 pages for object "account_history". 
CHECKDB found 0 allocation errors and 338 consistency errors in table "account_history" (object ID <ObjectID>). 
CHECKDB found 0 allocation errors and 338 consistency errors in database '<DatabaseName>'. 
DBCC execution completed. If DBCC printed error messages, contact your system administrator. 

DBCC results for 'table1'. 
Msg 2570, Level 16, State 3, Line <LineNum> 
Page (1:154), slot 0 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "col2" value is out of range for data type "real". Update column to a legal value. 
There are 4 rows in 2 pages for object "table1". 
CHECKDB found 0 allocation errors and 1 consistency errors in table 'table1' (object ID <ObjectID>). 
CHECKDB found 0 allocation errors and 1 consistency errors in database 'realdata'. DBCC execution completed. If DBCC printed error messages, contact your system administrator. 

DBCC results for 'table2'. 
Msg 2570, Level 16, State 3, Line <LineNum> 
Page (1:155), slot 0 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "col2" value is out of range for data type "decimal". Update column to a legal value. 
There are 4 rows in 1 pages for object "table2". 
CHECKDB found 0 allocation errors and 1 consistency errors in table 'table2' (object ID <ObjectID>). 
CHECKDB found 0 allocation errors and 1 consistency errors in database 'realdata'. DBCC execution completed. If DBCC printed error messages, contact your system administrator. 

DBCC results for 'table3'. 
Msg 2570, Level 16, State 3, Line <LineNum> 
Page (1:157), slot 0 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "col2" value is out of range for data type "datetime". Update column to a legal value. 
There are 3 rows in 1 pages for object "table3". 
CHECKDB found 0 allocation errors and 1 consistency errors in table 'table3' (object ID <ObjectID>). 
CHECKDB found 0 allocation errors and 1 consistency errors in database 'realdata'. DBCC execution completed. If DBCC printed error messages, contact your system administrator. 

For every row that contains an invalid column value, a 2570 error is generated. 

Penyebab

Data yang tidak valid atau di luar rentang mungkin telah disimpan dalam database SQL Server karena alasan berikut:

  • Data yang tidak valid dimasukkan ke SQL Server melalui peristiwa panggilan prosedur jarak jauh (RPC).
  • Potensi penyebab kerusakan data fisik lainnya membuat nilai kolom tidak valid.

Memperbaiki masalah kemurnian data

Kesalahan 2570 tidak dapat diperbaiki menggunakan salah DBCC satu opsi perbaikan. Alasannya adalah tidak dapat menentukan nilai apa yang harus digunakan untuk mengganti nilai kolom yang DBCC tidak valid. Dengan demikian, nilai kolom harus diperbarui secara manual. Untuk melakukan pembaruan manual, Anda harus menemukan baris yang bermasalah. Gunakan salah satu metode berikut untuk menemukan baris:

  • Jalankan kueri terhadap tabel yang berisi nilai yang tidak valid untuk menemukan baris yang berisi nilai yang tidak valid.
  • Gunakan informasi dari kesalahan 2570 untuk mengidentifikasi baris yang memiliki nilai tidak valid.

Kedua metode dirinci di bagian berikut dan memberikan contoh untuk menemukan baris yang memiliki data yang tidak valid.

Setelah Anda menemukan baris yang benar, keputusan perlu dibuat pada nilai baru yang akan digunakan untuk mengganti data yang tidak valid yang ada. Keputusan ini harus dibuat dengan sangat hati-hati, berdasarkan rentang nilai yang berlaku untuk aplikasi dan arti logis dari baris data tertentu tersebut. Anda memiliki pilihan berikut:

  • Jika Anda mengetahui nilainya, atur ke nilai tertentu tersebut.
  • Atur ke nilai default yang dapat diterima.
  • Atur nilai kolom ke NULL.
  • Atur nilai kolom ke nilai maksimum atau minimum untuk tipe data kolom tersebut.
  • Jika Anda yakin bahwa baris tertentu tidak berguna tanpa nilai yang valid untuk kolom, hapus baris tersebut sama sekali.

Menemukan baris dengan nilai yang tidak valid menggunakan kueri T-SQL

Jenis kueri yang perlu Anda jalankan untuk menemukan baris yang memiliki nilai yang tidak valid bergantung pada tipe data kolom yang melaporkan masalah. Jika Anda melihat pesan kesalahan 2570, Anda akan melihat dua informasi penting yang dapat membantu Anda dengan masalah ini. Dalam contoh berikut, nilai kolom account_name di luar rentang untuk jenis nvarchardata . Kita dapat dengan mudah mengidentifikasi kolom dengan masalah dan jenis data kolom yang terlibat. Dengan demikian, setelah Anda mengetahui jenis data dan kolom yang terlibat, Anda dapat merumuskan kueri untuk menemukan baris yang berisi nilai yang tidak valid untuk kolom tersebut, dan memilih kolom yang diperlukan untuk mengidentifikasi baris tersebut (sebagai predikat dalam WHERE klausul) untuk pembaruan atau penghapusan lebih lanjut.

Jenis data Unicode
SELECT col1, DATALENGTH(account_name) AS Length, account_name  
FROM account_history 
WHERE DATALENGTH(account_name) % 2 != 0
Jenis data float

Jalankan cuplikan kode berikut dengan mengubah col1 ke kolom kunci primer Anda yang sebenarnya, col2 ke kolom dari kesalahan 2570, dan table1 ke tabel dari CHECKDB output.

SELECT col1, col2 FROM table1 
WHERE col2<>0.0 AND (col2 < 2.23E-308 OR col2 > 1.79E+308) AND (col2 < -1.79E+308 OR col2 > -2.23E-308)
Jenis data nyata

Jalankan cuplikan kode berikut dengan mengubah col1 ke kolom kunci primer Anda yang sebenarnya, col2 ke kolom dari kesalahan 2570, dan table1 ke tabel dari CHECKDB output.

SELECT col1, col2 FROM testReal  
WHERE col2<>0.0 AND (col2 < CONVERT(real,1.18E-38) OR col2 > CONVERT(real,3.40E+38)) AND (col2 < CONVERT(real,-3.40E+38) OR col2 > CONVERT(real,-1.18E-38))  
ORDER BY col1; -- checks for real out of range 
Tipe data desimal dan numerik
SELECT col1 FROM table2 
WHERE col2 > 9999999999.99999  
OR col1 < -9999999999.99999

Perlu diingat bahwa Anda perlu menyesuaikan nilai berdasarkan presisi dan skala yang telah Anda tentukan kolom atau numeric .decimal Dalam contoh di atas, kolom didefinisikan sebagai col2 decimal(15,5).

Jenis data tanggalwaktu

Anda perlu menjalankan dua kueri berbeda untuk mengidentifikasi baris yang berisi nilai yang tidak valid untuk kolom.datetime

SELECT col1 FROM table3 
WHERE col2 < '1/1/1753 12:00:00 AM' OR col2 > '12/31/9999 11:59:59 PM' 

SELECT col1 FROM table3 WHERE 
((DATEPART(ms,col2)+ (1000*DATEPART(s,col2)) + (1000*60*DATEPART(mi,col2)) + (1000*60*60*DATEPART(hh,col2)))/(1000*0.00333))  > 25919999

Menemukan baris dengan nilai yang tidak valid menggunakan lokasi fisik

Anda dapat menggunakan metode ini jika Anda tidak dapat menemukan baris dengan nilai yang tidak valid dengan menggunakan metode T-SQL. Dalam pesan kesalahan 2570, lokasi fisik baris yang berisi nilai yang tidak valid dicetak. Misalnya, lihat pesan berikut:

Page (1:157), slot 0 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "col2" value is out of range for data type "datetime". Update column to a legal value. 

Dalam pesan ini, Anda melihat Page (1:157), slot 0. Ini adalah informasi yang Anda butuhkan untuk mengidentifikasi baris. FileId adalah 1, PageInFile adalah 157, dan SlotId adalah 0.

Setelah Anda memiliki informasi ini, Anda perlu menjalankan perintah berikut:

DBCC TRACEON (3604)
DBCC PAGE (realdata , 1 , 157 , 3)

Catatan

Perintah ini mencetak seluruh isi halaman. Parameter untuk DBCC PAGE perintah adalah:

  • Database name: Nama database.
  • File number: Nomor file file database.
  • Page number: Jumlah halaman yang ingin Anda periksa.
  • Print option: Parameter opsional yang menentukan tingkat detail output.

Setelah menjalankan perintah ini, Anda akan melihat output yang berisi informasi yang mirip dengan format berikut:

Slot 0  Offset 0x60 Length 19
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP
Memory Dump @0x44D1C060
00000000: 10001000 01000000 ffffffff ffffffff †................
00000010: 0200fc†††††††††††††††††††††††††††††††...
Slot 0 Column 0  Offset 0x4 Length 4  col1 = 1
Slot 0 Column 1  Offset 0x8 Length 8  col2 = Dec 31 1899 19:04PM
Slot 1 Offset 0x73 Length 19
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP
Memory Dump @0x44D1C073
00000000: 10001000 02000000 0ba96301 f8970000 †..........c.....
00000010: 0200fc†††††††††††††††††††††††††††††††...
Slot 1 Column 0 Offset 0x4 Length 4 col1 = 2
Slot 1 Column 1 Offset 0x8 Length 8 col2 = Jul 8 2006 9:34PM
Slot 2 Offset 0x86 Length 19
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP
Memory Dump @0x44D1C086
00000000: 10001000 03000000 0ba96301 f8970000 †..........c.....
00000010: 0200fc†††††††††††††††††††††††††††††††... 
Slot 2 Column 0 Offset 0x4 Length 4 col1 = 3
Slot 2 Column 1 Offset 0x8 Length 8 col2 = Jul 8 2006 9:34PM

Dalam output ini, Anda dapat dengan jelas melihat nilai kolom untuk baris yang diminati. Dalam hal ini, Anda memerlukan baris yang disimpan di slot 0 halaman. Dari pesan kesalahan, Anda tahu bahwa col2 itu adalah pesan yang bermasalah. Jadi Anda dapat mengambil nilai col1 untuk Slot 0 dan menggunakannya sebagai predikat dalam WHERE klausul pernyataan pembaruan atau pernyataan penghapusan Anda.

Peringatan

Kami menyarankan agar Anda menggunakan metode pertama (yaitu, gunakan kueri T-SQL untuk menemukan informasi yang diperlukan). DBCC PAGE Gunakan perintah hanya sebagai upaya terakhir. Berhati-hatilah saat Anda menggunakan perintah ini di lingkungan produksi. Disarankan untuk memulihkan database produksi di server pengujian, mendapatkan semua informasi yang diperlukan menggunakan DBCC PAGE, lalu melakukan pembaruan di server produksi. Seperti biasa, pastikan untuk menjaga cadangan tetap siap jika terjadi kesalahan, dan Anda perlu mengembalikan ke salinan database sebelumnya.

Lihat juga