INLEIDING

Dit artikel wordt beschreven voor SQL Server-fout 2570, waardoor de fout wordt veroorzaakt en hoe u het probleem kunt oplossen.

Meer informatie

DATA_PURITY-controles

In SQL Server 2005 is een nieuwe optie, DATA_PURITY, toegevoegd aan de opdrachten DBCC CHECKDB en DBCC CHECKTABLE. Als u een opdracht DBCC CHECKDB of DBCC CHECKTABLE met deze optie is ingeschakeld uitvoert, wordt de opdracht validatieprocedures "gegevens zuiverheid" van de kolomwaarde van elke in alle rijen van de tabel of tabellen in de database. Deze nieuwe controles worden uitgevoerd om ervoor te zorgen dat de waarden in de kolommen geldig zijn (dat wil zeggen, de waarden worden niet buiten het bereik van het domein die is gekoppeld aan het gegevenstype van de kolom). De aard van de validatie is uitgevoerd, is afhankelijk van het gegevenstype van de kolom. De volgende niet-limitatieve lijst bevat enkele voorbeelden:

Kolomgegevenstype

Type van de gegevensvalidatie wordt uitgevoerd

Unicode-teken

De lengte van de gegevens moet een veelvoud van 2.

Datum/tijd

Het veld dagen moet liggen tussen 1 Jan-1753 en 31 december 9999. Het veld moet eerder zijn dan "11:59:59:999 PM".

Echte en zweven

Controleren op de aanwezigheid van ongeldige drijvende-kommagetallen zoals SNAN, QNAN, NINF, ND, PD, PINF.

Niet alle gegevenstypen worden gecontroleerd op de geldigheid van de kolomgegevens. Alleen de opgeslagen waarde valt buiten het bereik kunnen worden gecontroleerd. Bijvoorbeeld het gegevenstype tinyint heeft een geldig bereik van 0 tot en met 255 en wordt opgeslagen in een enkele byte (dit kan alleen opslaan van waarden van 0 tot 255), zodat de controle de waarde is niet nodig.

De validatiecontroles van gegevens zuiverheid zijn niet automatisch ingeschakeld voor alle databases. De controles worden ingeschakeld afhankelijk van verschillende factoren:

  • Voor databases die zijn gemaakt in SQL Server 2005 en hoger, worden deze controles zijn standaard ingeschakeld en kunnen niet worden uitgeschakeld, zodat het gebruik van de optie DATA_PURITY bij het uitvoeren van een opdracht DBCC CHECKDB of DBCC CHECKTABLE niet relevant is.

  • Voor databases die zijn gemaakt in eerdere versies van SQL Server, zoals SQL Server 2000 en SQL Server 7.0, versies bijgewerkt naar SQL Server 2005, worden deze controles niet standaard ingeschakeld. Om deze controles moeten worden uitgevoerd, moet u de optie DATA_PURITY in de opdracht DBCC CHECKDB of DBCC CHECKTABLE. Dit kan resulteren in twee dingen:

    • De DBCC-opdracht is voltooid en wordt gemeld dat de database schoon is, met inbegrip van alle gegevens zuiverheid controles. Dit feit is vastgelegd in de koptekst van de database. Alle volgende DBCC CHECKDB of DBCC CHECKTABLE opdracht uitvoering ziet deze informatie en zal automatisch uitvoeren van de controles voor zuiverheid, zoals voor databases die zijn gemaakt op de SQL Server 2005 gebeurt. Met andere woorden, zodra een database is 'schoon' zijn bekend, worden de gegevens zuiverheid controles altijd uitgevoerd.

    • De DBCC-opdracht is voltooid, maar problemen rapporteert over inconsistenties in de gegevens. Als dit het geval is, u moet de database om de inconsistenties te verwijderen en vervolgens probeert de DBCC-opdracht opnieuw uitvoeren. U moet de optie DATA_PURITY voor de DBCC-opdracht opgeven voordat de database is gemeld aan schoon.

  • Als de optie PHYSICAL_ONLY is opgegeven bij de opdracht DBCC CHECKDB of DBCC CHECKTABLE wordt uitgevoerd, worden de gegevens zuiverheid controles niet uitgevoerd.

SYMPTOMEN

Ongeldige of buiten het bereik gegevens kunnen zijn opgeslagen in de SQL Server-database in eerdere versies om de volgende redenen:

  • Ongeldige gegevens is tijdens het gebruik van bulk insert methoden, zoals het hulpprogramma bcp in de bron aanwezig.

  • Ongeldige gegevens is doorgegeven via RPC gebeurtenis aanroepen van SQL Server.

  • Andere mogelijke oorzaken van beschadiging van fysieke gegevens links-de waarde in de kolom in een ongeldige status.

Als er ongeldige gegevens in een kolom van een tabel, kan dit nadelige afhankelijk van het soort bewerking die wordt uitgevoerd tegen de ongeldige gegevens. Het is echter ook mogelijk dat geen probleem wordt weergegeven en de ongeldige gegevens niet ontdekt worden totdat u een opdracht DBCC CHECKDB of DBCC CHECKTABLE in SQL Server 2005 en latere versies uitvoeren.

Sommige van de symptomen die is het mogelijk vanwege de aanwezigheid van ongeldige gegevens bevatten (maar niet beperkt tot):

  • Toegangsfouten of andere typen uitzonderingen tijdens het uitvoeren van query's op de betreffende kolom.

  • Onjuiste resultaten worden geretourneerd door de query's uitgevoerd op de betreffende kolom.

  • Fouten of problemen bij de statistieken worden gebouwd tegen de desbetreffende kolommen.

  • De volgende foutberichten worden weergegeven:

    Msg 9100 23 van niveau 2 staat, regel 1 mogelijke indexbeschadiging aangetroffen. DBCC CHECKDB uitvoeren.

Probleemrapport DATA_PURITY

Tijdens het uitvoeren van een DBCC CHECKDB of DBCC CHECKTABLE opdracht met de optie DATA_PURITY is ingeschakeld (of de controles worden uitgevoerd, automatisch gegevens-zuiverheid) en ongeldige gegevens in de tabellen is ingeschakeld door de opdracht DBCC bestaat, de DBCC-uitvoer bevat aanvullende berichten die wijzen op problemen met de gegevens. Sommige voorbeeldfoutberichten die wijzen op problemen met zuiverheid gegevens worden hieronder weergegeven:

DBCC-resultaten voor 'account_history'.
Msg 2570, niveau-16 staat 2, regel 1
De index pagina (1:1073), sleuf 33 in object-ID 1977058079, ID 0, partitie-ID 129568478265344, alloc eenheid-ID 129568478265344 (type "In de rij met gegevens"). Waarde in de kolom 'account_name_japan' is buiten het bereik van het gegevenstype "nvarchar". Kolom bijwerkt naar een geldige waarde.

Msg 2570, niveau-16 staat 2, regel 1
De index pagina (1:1156), sleuf 120 in object-ID 1977058079, ID 0, partitie-ID 129568478265344, alloc eenheid-ID 129568478265344 (type "In de rij met gegevens"). Waarde in de kolom 'account_name_japan' is buiten het bereik van het gegevenstype "nvarchar". Kolom bijwerkt naar een geldige waarde.
Er zijn 153137 rijen in 1080 's voor 'account_history'-object.
CHECKDB gevonden 0 toewijzingsfouten in de en 338 consistentie in de tabel 'account_history' (object-ID 1977058079).
CHECKDB gevonden 0 toewijzingsfouten in de en 338 consistentie in database 'BadUnicodeData'.
DBCC-uitvoering voltooid. Neem contact op met uw systeembeheerder als DBCC foutberichten heeft afgedrukt.

DBCC-resultaten voor "Tabel1".
Msg 2570, niveau-16 staat 3, regel 1
Pagina (1:154), sleuf 0 in object-ID 2073058421, de index-ID 0, partitie-ID 72057594038321152, alloc eenheid-ID 72057594042318848 (type "In de rij met gegevens"). Waarde in de kolom 'Kol2' is buiten het bereik van het gegevenstype 'echte'. Kolom bijwerkt naar een geldige waarde.
Er zijn 4 rijen in 2 pagina's voor "Tabel1"-object.
CHECKDB gevonden 0 toegewezen fouten en 1 consistentie in de tabel "Tabel1" (object-ID 2073058421).
CHECKDB gevonden toewijzingsfouten in 0 en 1 consistentie in database 'realdata'. DBCC-uitvoering voltooid. Neem contact op met uw systeembeheerder als DBCC foutberichten heeft afgedrukt.

DBCC-resultaten voor 'tabel2'.
Msg 2570, niveau-16 staat 3, regel 1
Pagina (1:155), sleuf 0 in object-ID 2105058535, de index-ID 0, partitie-ID 72057594038452224, alloc eenheid-ID 72057594042449920 (type "In de rij met gegevens"). Waarde in de kolom 'Kol2' is buiten het bereik van het gegevenstype 'decimaal'. Kolom bijwerkt naar een geldige waarde.
Er zijn 4 rijen in 1 pagina's voor het object "Tabel2".
CHECKDB gevonden 0 toegewezen fouten en 1 consistentie in de tabel 'tabel2' (object-ID 2105058535).
CHECKDB gevonden toewijzingsfouten in 0 en 1 consistentie in database 'realdata'. DBCC-uitvoering voltooid. Neem contact op met uw systeembeheerder als DBCC foutberichten heeft afgedrukt.

DBCC-resultaten voor 'Tabel3'.
Msg 2570, niveau-16 staat 3, regel 1
Pagina (1:157), sleuf 0 in object-ID 2121058592, de index-ID 0, partitie-ID 72057594038517760, alloc eenheid-ID 72057594042515456 (type "In de rij met gegevens"). Waarde in de kolom 'Kol2' is buiten het bereik van het gegevenstype 'datetime'. Kolom bijwerkt naar een geldige waarde.
Er zijn 3 rijen in 1 pagina's voor het object 'Tabel3'.
CHECKDB gevonden 0 toegewezen fouten en 1 consistentie in de tabel 'Tabel3' (object-ID 2121058592).
CHECKDB gevonden toewijzingsfouten in 0 en 1 consistentie in database 'realdata'. DBCC-uitvoering voltooid. Neem contact op met uw systeembeheerder als DBCC foutberichten heeft afgedrukt.

Voor elke rij die een ongeldige waarde bevat, wordt een 2570-fout gegenereerd.

De zuiverheid gegevens oplossen

De fouten 2570 kunnen niet worden hersteld met behulp van de herstelopties DBCC. Dit is omdat het is onmogelijk voor DBCC om te bepalen welke waarde moet worden gebruikt ter vervanging van de ongeldige waarde. Dus moet de waarde in de kolom handmatig worden bijgewerkt.

U hebt voor het uitvoeren van een handmatige update, zoek de rij die het probleem heeft. Er zijn twee manieren om dit te bereiken.

  • Uitvoeren van een query op de tabel met geldige waarden op om te zoeken naar rijen die ongeldige waarden bevatten.

  • Gebruik de informatie uit de fout 2570 ter identificatie van de rijen die u een ongeldige waarde hebt.

Bespreken we beide methoden in bijzonderheden, de rijen met ongeldige gegevens zoeken met voorbeelden.

Als u de juiste rij hebt gevonden, moet een beslissing van de nieuwe waarde die wordt gebruikt voor het vervangen van de bestaande gegevens ongeldig worden gemaakt. Deze beschikking heeft tot heel zorgvuldig op basis van het bereik van geldige waarden voor de toepassing worden gemaakt en wat logische zin voor de betreffende rij met gegevens maakt. De keuzemogelijkheden zijn:

  • Als u welke waarde u weet moet, stel deze in op deze specifieke waarde.

  • Stel deze in op een standaardwaarde acceptabel.

  • De waarde in de kolom ingesteld op NULL.

  • De waarde in de kolom ingesteld op de maximale of minimale waarde voor dat gegevenstype van de kolom.

  • Als u van mening bent dat bepaalde rij niet van enig gebruik zonder een geldige waarde voor de kolom, kunt u die rij helemaal verwijderen.

Zoeken naar rijen ongeldige waarden met behulp van T-SQL-query 's

Het type query dat u moet uitvoeren om te zoeken naar rijen die u ongeldige waarden hebt zijn afhankelijk van het gegevenstype van de kolom die u een probleem gemeld. Als u het foutbericht 2570 bekijkt, ziet u twee belangrijke onderdelen van de informatie die u hierbij helpen. In het volgende voorbeeld wordt is de waarde in de kolom 'account_name_japan' buiten het bereik van het gegevenstype "nvarchar." We kunt de kolom met het probleem als het gegevenstype van de kolom die gemakkelijk herkennen. Dus zodra u het gegevenstype kent en de kolom die betrokken zijn, kunt u de query om de rijen met ongeldige waarden voor die kolom formuleren, de kolommen selecteren die nodig zijn om aan te geven die rij (de predikaten gebruikt in een WHERE-component) voor een verdere bijwerken of verwijderen.

Unicode-gegevenstype:

SELECT col1 ,DATALENGTH(account_name_japan) as Length ,account_name_japan 
FROM account_history
WHERE DATALENGTH(account_name_japan) % 2 != 0


Gegevenstype Float:

-- Change col1 to your actual primary key column(s), col2 to the column from the 2570 error, table1 to the table from the 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)


Gegevenstype Real:

-- Change col1 to your actual primary key column(s), col2 to the column from the 2570 error, table1 to the table from -- the 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

Decimal en Numeric gegevenstype:

SELECT col1 FROM table2
WHERE col2 > 9999999999.99999
OR col1 < -9999999999.99999

Houd er rekening mee dat u moet aanpassen van de waarden op basis van de precisie en schaal waarmee u de kolom decimal of numeric hebt gedefinieerd. In het bovenstaande voorbeeld is de kolom gedefinieerd als Kol2 decimal(15,5).

Datum tijd data type:
Moet u twee afzonderlijke query's voor de rijen met ongeldige waarden voor kolom voor datum en tijd worden uitgevoerd.

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

Rijen zoeken met een ongeldige waarde met behulp van de fysieke locatie:

U kunt deze methode gebruiken als u niet vinden met behulp van de hierboven besproken T-SQL-methode van rijen. De fysieke locatie van de rij met de ongeldige waarde wordt in het foutbericht 2570 afgedrukt. Bekijk bijvoorbeeld het volgende bericht weergegeven:

Pagina (1:157), sleuf 0 in object-ID 2121058592, de index-ID 0, partitie-ID 72057594038517760, alloc eenheid-ID 72057594042515456 (type "In de rij met gegevens"). Waarde in de kolom 'Kol2' is buiten het bereik van het gegevenstype 'datetime'. Kolom bijwerkt naar een geldige waarde.

In dit bericht, ziet u de informatie: pagina (1:157), sleuf 0. Dit is de informatie die u nodig hebt voor het identificeren van de rij. De bestands-id 1 is, het PageInFile is 157 en de sleuf is 0. Als u deze informatie hebt, moet u voor het uitvoeren van de opdracht als volgt:

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

Met deze opdracht wordt de gehele inhoud van een pagina afdrukken. Parameters voor de opdracht DBCC PAGE zijn:

  • naam van de database

  • Bestands-id

  • PageInFile

  • afdrukoptie

Nadat u deze opdracht uitvoert, ziet u uitvoer die informatie die vergelijkbaar is met de volgende notatie bevat:

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

In deze uitvoer kunt u de kolomwaarden voor de rij die voor u van belang duidelijk te zien. In dit geval moet u de rij 0-sleuf van de pagina is opgeslagen. In het foutbericht wordt weergegeven weet u dat Kol2 is het bestand met het probleem. Zo kan de waarde van Kol1 nemen voor sleuf 0 en gebruiken als het predikaat in de WHERE-component van de instructie update of delete-instructie.

Waarschuwing Wij raden aan dat u de eerste methode (gebruik T-SQL query om te zoeken naar de vereiste gegevens) gebruiken. Gebruik de opdracht DBCC PAGE alleen als laatste redmiddel. Uiterst voorzichtig nemen tijdens het gebruik van deze opdracht in een productieomgeving. Het is raadzaam de productiedatabase op een testserver herstellen en vervolgens de vereiste gegevens met DBCC PAGE en voert u de updates op de productieserver. Zoals altijd, zorg ervoor dat een back-up gereed houden in het geval er iets mis gaat en u wilt terugkeren naar een eerdere versie van de database.

Referenties

Zie het onderwerp 'DBCC CHECKDB (Transact-SQL)' op de volgende website van Microsoft Developer Network (MSDN) voor meer informatie over de instructie DBCC CHECKDB:

http://msdn2.microsoft.com/en-us/library/ms176064.aspxVoor meer informatie over bekende problemen in SQL Server 2000, klikt u op het volgende artikel in de Microsoft Knowledge Base:

900335 oplossen: de SQL Server 2000-database automatisch herstelbewerking mislukt mogelijk als een index een gegevenstype FLOAT of REAL gegevenstype bevat en dit gegevenstype een waarde NaN bevat

Zie het onderwerp 'Aanroepen van een opgeslagen Procedure (OLE DB)' op de MSDN-website voor meer informatie over RPC-gebeurtenissen:

http://msdn2.microsoft.com/en-us/library/aa198358(SQL.80).aspxZie het onderwerp 'Aanroepen van een opgeslagen Procedure (OLE DB)' op de MSDN-website voor meer informatie over de verschillende gegevenstypen:

http://msdn2.microsoft.com/en-us/library/ms187752.aspxGa naar de volgende Intel-website voor meer informatie over zwevende punt waarde verdragen:

http://www.intel.com/design/pentiumii/manuals/243191.htmMicrosoft biedt contactinformatie van derden om u te helpen technische ondersteuning te vinden. Deze contactinformatie kan zonder kennisgeving worden gewijzigd. Microsoft garandeert niet de juistheid van deze contactinformatie van derden.

Meer hulp nodig?

Uw vaardigheden uitbreiden
Training verkennen
Als eerste nieuwe functies krijgen
Deelnemen aan Microsoft insiders

Was deze informatie nuttig?

Hoe tevreden bent u met de taalkwaliteit?
Wat heeft uw ervaring beïnvloed?

Bedankt voor uw feedback.

×