MSSQLSERVER_2570

Şunlar için geçerlidir: SQL Server

Details

Attribute Value
Ürün Adı SQL Server
Olay Kimliği 2570
Olay Kaynağı MSSQLSERVER
Bileşen SQLEngine
Sembolik Ad DBCC_COLUMN_VALUE_OUT_OF_RANGE
İleti Metni Sayfa P_ID, nesne kimliği O_ID'de yuva S_ID, indeks kimliği I_ID, bölüm kimliği PN_ID, alloc birim ID'si A_ID (tip TYPE). Sütun COLUMN_NAME değeri, "DATATYPE" veri tipi için aralık dışındadır. Sütunu yasal bir değere güncelleştirin.

Explanation

Belirtilen sütunda yer alan sütun değeri, sütun veri tipinin olası değerler aralığının dışındadır. Bir tablo sütununda geçersiz veriniz varsa, geçersiz veriye karşı yapılan işlem türüne bağlı olarak sorunlarla karşılaşabilirsiniz. Ancak, herhangi bir sorun çıkmayabilir ve geçersiz veriler bir veya DBCC CHECKTABLE komutu DBCC CHECKDB çalıştırmadan keşfedilir.

Geçersiz verilerin varlığı nedeniyle fark edebileceğiniz bazı belirtiler şunlardır (ancak bunlarla sınırlı değildir):

  • Etkilenen sütuna karşı sorgular yürütülürken erişim ihlalleri veya diğer istisnalar.
  • Etkilenen sütuna karşı yürütülen sorgularda yanlış sonuçlar döner.
  • Etkilenen sütuna karşı istatistikler oluşturulurken hatalar veya sorunlar.
  • Aşağıdaki gibi hata mesajları:

    Mesaj 9100, Seviye 23, Durum 2, Hat <Hatı Numarası> Olası indeks bozulması tespit edildi. DBCC CHECKDB'i çalıştırın.

DATA_PURITY çekleri

DBCC CHECKDB veya DBCC CHECKTABLE komutu çalıştırdığınızda, SQL Server veritabanındaki her tablonun her satırındaki sütun değerlerinin "veri saflığı" doğrulamasını gerçekleştirir. Bu kontroller, sütunlarda saklanan değerlerin geçerli olduğundan emin olmak için yapılır. Yani, doğrulama, değerlerin sütunların veri tipiyle ilişkili alan aralığının dışında olmadığını garanti eder. Yapılan doğrulamanın doğası, sütunun veri tipine bağlıdır. Aşağıdaki kapsamlı olmayan liste bazı örnekler vermektedir:

Sütun veri türü Yapılan veri doğrulama türü
Unicode karakteri Veri uzunluğu 2'nin katı olmalıdır.
Tarih ve saat Tarih alanı 1 Ocak 1753 ile 31 Aralık 9999 arasında olmalıdır. Zaman alanı "11:59:59.997PM"den daha erken olmalı.
Gerçek ve Yüzen SNAN, QNAN, NINF, ND, PD ve PINF gibi geçersiz kayan nokta değerlerinin varlığını kontrol edin.

Tüm veri türleri sütun verisinin geçerliliği açısından kontrol edilmez. Yalnızca aralık dışı depolanmış değerleri olanlar kontrol edilir. Örneğin, veri tipi tinyint 0'dan 255'e kadar geçerli bir aralığa sahiptir ve tek bir baytta saklanır (bu bayt sadece 0 ile 255 arasında değerleri depolayabilir), bu yüzden değeri kontrol etmek gerekmez.

Note

Bu kontroller varsayılan olarak etkinleştirilmiş ve devre dışı bırakılamaz, bu yüzden bir DBCC CHECKDB veya DBCC CHECKTABLE komutunu çalıştırırken DATA_PURITY seçeneğini açıkça kullanmaya gerek yoktur. Ancak, PHYSICAL_ONLY seçeneğini veya DBCC CHECKDBDBCC CHECKTABLEile kullanırsanız, veri saflığı kontrolleri yapılmaz.

DATA_PURITY sorun raporu

Bir DBCC CHECKDB veya DBCC CHECKTABLE komutunu seçenekle DATA_PURITY çalıştırdığınızda (veya veri saflığı kontrolleri otomatik olarak çalıştırıldığında) ve komutlarla kontrol edilen tablolarda DBCC geçersiz veri bulunduğunda, DBCC çıktı veriyle ilgili sorunları gösteren başka mesajlar da içerir. Aşağıdaki örnek hata mesajları veri saflığı sorunlarını gösterir:

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. 

Cause

Geçersiz veya aralık dışı veriler aşağıdaki nedenlerle SQL Server veritabanında saklanmış olabilir:

  • Geçersiz veriler, uzaktan prosedür çağrısı (RPC) olayları aracılığıyla SQL Server'a eklendi.
  • Fiziksel veri bozulmasının diğer olası nedenleri sütun değerini geçersiz hale getirmiştir.

Veri saflığı sorununu düzeltin

2570 hataları, onarım seçeneklerinin hiçbiri DBCC kullanılarak düzeltilemez. Sebebi, DBCC geçersiz sütun değerinin yerine hangi değerin kullanılacağı belirlenememesi. Bu nedenle, sütun değeri manuel olarak güncellenmelidir. Manuel güncelleme yapmak için sorunun olduğu satırı bulmanız gerekir. Satırı bulmak için aşağıdaki yöntemlerden birini kullanın:

  • Geçersiz değerleri içeren bir tabloya karşı bir sorgu çalıştırarak geçersiz değerleri içeren satırları bulun.
  • 2570 hatasından alınan bilgileri kullanarak geçersiz değerlere sahip satırları belirleyin.

Her iki yöntem de aşağıdaki bölümlerde detaylandırılmış ve geçersiz veri içeren satırlar bulmak için örnekler sunmaktadır.

Doğru satırı bulduğunuzda, mevcut geçersiz veriyi yerine koyacak yeni değer hakkında karar verilmelidir. Bu karar, uygulamaya uygulanabilir değer aralığına ve o veri satırının mantıksal anlamına dayanarak çok dikkatli alınmalıdır. Aşağıdaki seçeneklere sahipsiniz:

  • Hangi değer olması gerektiğini biliyorsanız, onu o belirli değere ayarlayın.
  • Kabul edilebilir bir varsayılan değere ayarlayın.
  • Sütun değerini 'ye NULLayarlayın.
  • Sütun değerini, sütunun o veri tipi için maksimum veya minimum değere ayarlayın.
  • Eğer belirli satırın geçerli bir değeri olmadan işe yaramadığını düşünüyorsanız, o satırı tamamen silin.

T-SQL sorguları kullanarak geçersiz değerli satırları bulun

Geçersiz değerlere sahip satır bulmak için yürütmeniz gereken sorgu türü, sorunu bildiren sütunun veri türüne bağlıdır. 2570 hata mesajına bakarsanız, bu sorunda size yardımcı olabilecek iki önemli bilgi parçasını göreceksiniz. Aşağıdaki örnekte, sütunun account_name değeri veri tipi nvarchariçin aralık dışındadır. Sorunun olduğu sütunu ve ilgili sütunun veri tipini kolayca tespit edebiliriz. Böylece, veri tipini ve ilgili sütunu bildikten sonra, o sütun için geçersiz değerleri içeren satır bulmak için sorgular oluşturabilir ve herhangi bir güncelleme veya silme için o satırı (bir WHERE cümledeki önlem olarak) tanımlamak için gereken sütunları seçebilirsiniz.

Unicode veri tipi
SELECT col1, DATALENGTH(account_name) AS Length, account_name  
FROM account_history 
WHERE DATALENGTH(account_name) % 2 != 0
Float veri tipi

Aşağıdaki kod parçasını çalıştırın; gerçek birincil anahtar sütununuza, col2 2570 hatasından sütuna ve table1 çıktıdan tabloya CHECKDB geçincol1.

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)
Gerçek veri tipi

Aşağıdaki kod parçasını çalıştırın; gerçek birincil anahtar sütununuza, col2 2570 hatasından sütuna ve table1 çıktıdan tabloya CHECKDB geçincol1.

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 
ondalık ve sayısal veri türleri
SELECT col1 FROM table2 
WHERE col2 > 9999999999.99999  
OR col1 < -9999999999.99999

Değerleri, or numeric sütununu tanımladığınız hassasiyet ve ölçek decimal esasında ayarlamanız gerektiğini unutmayın. Yukarıdaki örnekte, sütun olarak tanımlanır.col2 decimal(15,5)

Tarih zamanı veri tipi

Sütun için geçersiz değerleri datetime içeren satırları belirlemek için iki farklı sorgu çalıştırmanız gerekir.

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

Geçersiz değerlere sahip satırları fiziksel konum kullanarak bulun

Geçersiz değerli satırları bulamazsanız T-SQL yöntemiyle bu yöntemi kullanabilirsiniz. 2570 hata mesajında, geçersiz değeri içeren satırın fiziksel konumu yazdırılır. Örneğin, aşağıdaki mesaja bakın:

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. 

Bu mesajda Page (1:157), slot 0fark ediyorsunuz . Sırayı tanımlamak için gereken bilgi. FileId, 1PageInFile , , 157ve SlotId şeklindedir0.

Bu bilgiyi aldıktan sonra aşağıdaki komutu çalıştırmanız gerekir:

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

Note

Bu komut, bir sayfanın tüm içeriğini bastırır. Komutun DBCC PAGE parametreleri şunlardır:

  • Database name: Veritabanının adı.
  • File number: Veritabanı dosyasının dosya numarası.
  • Page number: İncelemek istediğiniz sayfanın numarası.
  • Print option: Çıktı detay seviyesini belirleyen isteğe bağlı bir parametre.

Bu komutu çalıştırdığınızda, aşağıdaki formata benzer bilgiler içeren bir çıktı göreceksiniz:

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

Bu çıktıda, ilgi çekici satırın sütun değerlerini net bir şekilde görebilirsiniz. Bu durumda, satırın sayfada saklanması slot 0 gerekir. Hata mesajından, sorunun orada col2 olduğunu anlıyorsunuz. Yani for Slot 0 değerini col1 alıp update veya delete ifadenizin maddesinde önlem WHERE olarak kullanabilirsiniz.

Warning

İlk yöntemi kullanmanızı öneririz (yani, gerekli bilgileri bulmak için T-SQL sorgularını kullanmak). Komutu DBCC PAGE sadece son çare olarak kullanın. Bu komutu üretim ortamında kullanırken en dikkatli olun. Üretim veritabanını test sunucusunda geri yüklemek, gerekli tüm bilgileri almak DBCC PAGEve ardından güncellemeleri üretim sunucusunda yapmak önerilir. Her zamanki gibi, bir şeyler ters giderse ve veritabanının önceki bir kopyasına geri dönmeniz gerekirse yedek hazır tutun.

Ayrıca bakınız