Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Podrobnosti
| Attribute | Value |
|---|---|
| Název produktu | SQL Server |
| ID události | 2570 |
| Zdroj události | MSSQLSERVER |
| Součást | SQLEngine |
| Symbolický název | DBCC_COLUMN_VALUE_OUT_OF_RANGE |
| Text zprávy | Stránka P_ID, slot S_ID v ID objektu O_ID, ID indexu I_ID, ID oddílu PN_ID, ID jednotky A_ID (typ TYPE). Hodnota COLUMN_NAME sloupce je mimo rozsah pro datový typ "DATATYPE". Aktualizujte sloupec na právní hodnotu. |
Vysvětlení
Hodnota sloupce obsažená ve specifikovaném sloupci je mimo rozsah možných hodnot pro daný sloupcový datový typ. Pokud máte neplatná data ve sloupci tabulky, můžete narazit na problémy v závislosti na typu operací prováděných proti neplatným datům. Je však také možné, že se problém neobjeví a neplatná data nebudou odhalena, dokud nespustíte DBCC CHECKDB příkaz OR DBCC CHECKTABLE .
Některé příznaky, které si můžete všimnout kvůli neplatným údajům, zahrnují (ale nejsou omezeny na):
- Porušení přístupu nebo jiné výjimky při provádění dotazů proti postiženému sloupci.
- Nesprávné výsledky vrácené dotazy provedenými proti postiženému sloupci.
- Chyby nebo problémy při vytváření statistik proti postiženému sloupci.
- Chybové zprávy jako je následující:
Msg 9100, úroveň 23, stav 2, číslo řádku <Možná> detekce indexu. Spusťte DBCC CHECKDB.
DATA_PURITY kontroly
Když spustíte příkaz DBCC CHECKDB nebo DBCC CHECKTABLE, SQL Server provede validaci "datové čistoty" hodnot sloupců v každém řádku každé tabulky v databázi. Tyto kontroly se provádějí proto, aby se zajistilo, že hodnoty uložené ve sloupcích jsou platné. To znamená, že validace zajišťuje, že hodnoty nejsou mimo rozsah domény spojené s datovým typem sloupců. Povaha provedené validace závisí na typu dat ve sloupci. Následující nevyčerpávající seznam uvádí několik příkladů:
| Datový typ sloupce | Typ ověření dat prováděných |
|---|---|
| Znak Unicode | Délka dat by měla být násobkem 2. |
| Datum a čas | Pole s datem by mělo být mezi 1. lednem 1753 a 31. prosincem 9999. Časové pole musí být dříve než "23:59:59.997." |
| Real a Float | Zkontrolujte existenci neplatných hodnot s plovoucí desetinnou čárkou jako SNAN, QNAN, NINF, ND, PD a PINF. |
Ne všechny datové typy jsou kontrolovány z hlediska platnosti sloupcových dat. Kontrolují se pouze ty, které mohou mít uloženou hodnotu mimo rozsah. Například tinyint datový typ má platný rozsah od 0 do 255 a je uložen v jednom bajtu (který může uložit pouze hodnoty mezi 0 a 255), takže kontrola hodnoty není nutná.
Note
Tyto kontroly jsou ve výchozím nastavení povolené a nelze je vypnout, takže není nutné explicitně používat možnost DATA_PURITY při provádění příkazu DBCC CHECKDB OR DBCC CHECKTABLE . Pokud však použijete možnost PHYSICAL_ONLY s DBCC CHECKDB nebo DBCC CHECKTABLE, kontrola čistoty dat se neprovádí.
DATA_PURITY hlášení problému
Když spustíte DBCC CHECKDB příkaz or DBCC CHECKTABLE s povolenou DATA_PURITY volbou (nebo se automaticky provedou kontroly čistoty dat) a v tabulkách kontrolovaných příkazy DBCC existují neplatná data, výstup bude obsahovat další zprávy, DBCC které indikují problémy související s daty. Následující ukázkové chybové zprávy ukazují problémy s čistotou dat:
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.
Příčina
Neplatná nebo mimo dosah dat mohla být uložena v databázi SQL Server z následujících důvodů:
- Neplatná data byla do SQL Server vložena prostřednictvím událostí vzdáleného volání procedur (RPC).
- Další možné příčiny fyzického poškození dat způsobily, že hodnota sloupce byla neplatná.
Opravte problém čistoty dat
Chyby 2570 nelze opravit žádnou z DBCC možností opravy. Důvodem je, že DBCC nelze určit, jaká hodnota by měla být použita jako náhrada za neplatný sloupec. Hodnota sloupce je tedy nutná aktualizovat ručně. Pro ruční aktualizaci musíte najít řádek, kde je problém. Použijte jednu z následujících metod k nalezení řádku:
- Proveďte dotaz proti tabulce obsahující neplatné hodnoty, abyste našli řádky obsahující neplatné hodnoty.
- Použijte informace z chyby 2570 k identifikaci řádků s neplatnými hodnotami.
Obě metody jsou podrobně popsány v následujících sekcích a poskytují příklady pro nalezení řádků s neplatnými daty.
Jakmile najdete správný řádek, je třeba rozhodnout o nové hodnotě, která bude použita k nahrazení stávajících neplatných dat. Toto rozhodnutí musí být učiněno velmi pečlivě, na základě rozsahu hodnot použitelných pro aplikaci a logického významu daného řádku dat. Máte následující možnosti:
- Pokud víte, jakou hodnotu by měla mít, nastavte ji na tuto konkrétní hodnotu.
- Nastavte to na přijatelnou výchozí hodnotu.
- Nastavte hodnotu sloupce na
NULL. - Nastavte hodnotu sloupce na maximální nebo minimální hodnotu pro daný typ datového sloupce.
- Pokud věříte, že konkrétní řádek není užitečný bez platné hodnoty sloupce, tento řádek úplně smažte.
Najděte řádky s neplatnými hodnotami pomocí T-SQL dotazů
Typ dotazu, který musíte provést k nalezení řádků s neplatnými hodnotami, závisí na datovém typu sloupce, který hlásí problém. Pokud se podíváte na chybovou zprávu 2570, všimnete si dvou důležitých informací, které vám mohou pomoci s tímto problémem. V následujícím příkladu je hodnota sloupce account_name mimo rozsah pro datový typ nvarchar. Snadno identifikujeme sloupec s problémem a datovým typem daného sloupce. Jakmile znáte datový typ a příslušný sloupec, můžete formulovat dotazy, které najdou řádky obsahující neplatné hodnoty pro daný sloupec, a vybrat sloupce potřebné k identifikaci tohoto řádku (jako predikáty v klauzuli WHERE ) pro případnou další aktualizaci nebo smazání.
Unicode datový typ
SELECT col1, DATALENGTH(account_name) AS Length, account_name
FROM account_history
WHERE DATALENGTH(account_name) % 2 != 0
Typ plovoucích dat
Spusť následující úryvek kódu tak, že změníš col1 sloupce na skutečný primární klíč, col2 sloupec z chyby 2570 a table1 na tabuli z výstupu CHECKDB .
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)
Reálný datový typ
Spusť následující úryvek kódu tak, že změníš col1 sloupce na skutečný primární klíč, col2 sloupec z chyby 2570 a table1 na tabuli z výstupu CHECKDB .
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
Desetinné a číselné datové typy
SELECT col1 FROM table2
WHERE col2 > 9999999999.99999
OR col1 < -9999999999.99999
Mějte na paměti, že je potřeba upravit hodnoty podle přesnosti a měřítka, s jakým jste definovali decimal sloupec OR numeric . V uvedeném příkladu je sloupec definován jako col2 decimal(15,5).
Datový typ datového času
Musíte provést dva různé dotazy, abyste identifikovali řádky obsahující neplatné hodnoty pro daný datetime sloupec.
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
Najděte řádky s neplatnými hodnotami pomocí fyzické polohy
Tuto metodu můžete použít, pokud nenajdete řádky s neplatnými hodnotami, pomocí metody T-SQL. V chybové zprávě 2570 je vytištěno fyzické místo řádku, který obsahuje neplatnou hodnotu. Například se podívejte na následující zprávu:
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.
V této zprávě si všimnete Page (1:157), slot 0. Jsou to informace, které potřebujete k identifikaci řádku. Je FileId1, je PageInFile157SlotId a je 0.
Jakmile budete mít tyto informace, musíte provést následující příkaz:
DBCC TRACEON (3604)
DBCC PAGE (realdata , 1 , 157 , 3)
Note
Tento příkaz vytiskne celý obsah stránky. Parametry příkazu DBCC PAGE jsou:
-
Database name: Název databáze. -
File number: Číslo souboru databázového souboru. -
Page number: Číslo stránky, kterou chcete prozkoumat. -
Print option: Volitelný parametr, který určuje úroveň výstupních detailů.
Jakmile tento příkaz provedete, všimnete si výstupu obsahujícího informace podobné následujícímu formátu:
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
V tomto výstupu můžete jasně vidět hodnoty sloupců pro daný řádek. V tomto případě je potřeba, aby byl řádek uložen na slot 0 stránce. Z chybové zprávy víte, že problém col2 je ten, kdo je v tom. Takže můžete vzít hodnotu col1 for Slot 0 a použít ji jako predikát v klauzuli WHERE vašeho update nebo delete příkazu.
Warning
Doporučujeme použít první metodu (tedy použít T-SQL dotazy k nalezení požadovaných informací). Používejte příkaz DBCC PAGE jen jako poslední možnost. Buďte maximálně opatrní, když tento příkaz používáte v produkčním prostředí. Doporučuje se obnovit produkční databázi na testovacím serveru, získat všechny potřebné informace pomocí DBCC PAGE, a pak provést aktualizace na produkčním serveru. Jako vždy mějte připravenou zálohu pro případ, že by se něco pokazilo a bylo potřeba vrátit se k dřívější kopii databáze.
Viz také
- UPDATE (Transact-SQL)
- Datové typy (Transact-SQL)
- DBCC (Transact-SQL)
- Volání uložené procedury