次の方法で共有


MSSQLSERVER_2570

適用対象: SQL Server

詳細

属性
製品名 SQL Server
イベント ID 2570
イベント ソース MSSQLSERVER
コンポーネント SQLEngine
シンボル名 DBCC_COLUMN_VALUE_OUT_OF_RANGE
メッセージ テキスト ページ P_ID、オブジェクト ID O_ID のスロット S_ID、インデックス ID I_ID、パーティション ID PN_ID、アロケーション ユニット ID A_ID (型 TYPE)。 列 COLUMN_NAME の値が、データ型 "DATATYPE" の範囲外です。 列を有効な値に更新してください。

説明

指定した列に含まれる列の値が、列データ型に使用できる値の範囲外です。 テーブル列に無効なデータがある場合は、無効なデータに対して実行される操作の種類によっては、問題が発生する可能性があります。 ただし、 DBCC CHECKDB または DBCC CHECKTABLE コマンドを実行するまで、問題が発生せず、無効なデータが検出されない可能性もあります。

無効なデータが存在するため、次のような症状が発生する可能性があります (ただし、これらに限定されません)。

  • 影響を受ける列に対してクエリを実行するときのアクセス違反またはその他の例外。
  • 影響を受ける列に対して実行されたクエリによって返される正しくない結果。
  • 影響を受ける列に対して統計が作成されている場合のエラーまたは問題。
  • 次のようなエラー メッセージ:

    メッセージ 9100、レベル 23、状態 2、行 <LineNum> インデックスの破損の可能性が検出されました。 DBCC CHECKDB を実行してください。

DATA_PURITY チェック

DBCC CHECKDB または DBCC CHECKTABLE コマンドを実行すると、SQL Server はデータベース内のすべてのテーブルの各行で列値の "データの純度" 検証を実行します。 これらのチェックは、列に格納されている値が有効であることを確認するために実行されます。 つまり、検証により、列のデータ型に関連付けられているドメインの値が範囲外でないことを確認します。 実行される検証の性質は、列のデータ型によって異なります。 次の一覧では、いくつかの例を示します。

列のデータ型 実行されたデータ検証の種類
Unicode 文字 データの長さは 2 の倍数にする必要があります。
日時 日付フィールドは、1753 年 1 月 1 日から 9999 年 12 月 31 日の間である必要があります。 時刻フィールドは、"11:59:59.997PM" より前である必要があります。
Real と Float SNAN、QNAN、NINF、ND、PD、PINF などの無効な浮動小数点値が存在するかどうかを確認します。

すべてのデータ型で列データの有効性がチェックされるわけではありません。 範囲外の値が格納されている可能性がある値のみがチェックされます。 たとえば、 tinyint データ型の有効な範囲は 0 から 255 で、1 バイトに格納されます (0 から 255 までの値のみを格納できます)。そのため、値を確認する必要はありません。

Note

これらのチェックは既定で有効になっており、無効にできないため、DBCC CHECKDBまたは DBCC CHECKTABLE コマンドを実行するときに、DATA_PURITY オプションを明示的に使用する必要はありません。 ただし、DBCC CHECKDBまたはDBCC CHECKTABLEPHYSICAL_ONLY オプションを使用する場合、データの純度チェックは実行されません。

DATA_PURITY問題レポート

DATA_PURITY オプションを有効にしてDBCC CHECKDBまたはDBCC CHECKTABLEコマンドを実行すると (またはデータの純度チェックが自動的に実行されます)、DBCC コマンドによってチェックされたテーブルに無効なデータが存在する場合、DBCC出力には、データに関連する問題を示す他のメッセージが含まれます。 次のサンプル エラー メッセージは、データの純度の問題を示しています。

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. 

原因

次の理由により、無効なデータまたは範囲外のデータが SQL Server データベースに格納されている可能性があります。

  • リモート プロシージャ コール (RPC) イベントを介して SQL Server に無効なデータが挿入されました。
  • 物理データの破損のその他の潜在的な原因により、列の値が無効になりました。

データの純度の問題を修正する

2570 エラーは、 DBCC 修復オプションを使用して修復することはできません。 その理由 DBCC 、無効な列の値を置き換えるために使用する必要がある値を判断できないためです。 したがって、列の値は手動で更新する必要があります。 手動更新を実行するには、問題のある行を見つける必要があります。 行を検索するには、次のいずれかの方法を使用します。

  • 無効な値を含むテーブルに対してクエリを実行し、無効な値を含む行を検索します。
  • エラー 2570 の情報を使用して、無効な値を持つ行を識別します。

どちらの方法も次のセクションで詳しく説明し、無効なデータを持つ行を検索する例を示します。

正しい行が見つかると、既存の無効なデータを置き換えるために使用される新しい値を決定する必要があります。 この決定は、アプリケーションに適用できる値の範囲と、その特定のデータ行の論理的な意味に基づいて、非常に慎重に行う必要があります。 次の選択肢があります。

  • 必要な値がわかっている場合は、その特定の値に設定します。
  • 許容される既定値に設定します。
  • 列の値を NULLに設定します。
  • 列の値を、その列のデータ型の最大値または最小値に設定します。
  • 列に有効な値がないと特定の行が役に立たないと思われる場合は、その行を完全に削除します。

T-SQL クエリを使用して無効な値を持つ行を検索する

無効な値を持つ行を検索するために実行する必要があるクエリの種類は、問題を報告する列のデータ型によって異なります。 2570 エラー メッセージを見ると、この問題に役立つ 2 つの重要な情報が表示されます。 次の例では、 account_name 列の値がデータ型 nvarcharの範囲外です。 問題のある列と関連する列のデータ型を簡単に識別できます。 したがって、データ型と関連する列がわかったら、クエリを作成して、その列の無効な値を含む行を検索し、その行を識別するために必要な列 ( WHERE 句の述語として) を選択して、それ以上の更新または削除を行うことができます。

Unicode データ型
SELECT col1, DATALENGTH(account_name) AS Length, account_name  
FROM account_history 
WHERE DATALENGTH(account_name) % 2 != 0
Float データ型

次のコード スニペットを実行するには、col1を実際の主キー列に変更し、2570 エラーから列にcol2し、CHECKDB出力からテーブルにtable1します。

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)
実際のデータ型

次のコード スニペットを実行するには、col1を実際の主キー列に変更し、2570 エラーから列にcol2し、CHECKDB出力からテーブルにtable1します。

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 
10 進データ型と数値データ型
SELECT col1 FROM table2 
WHERE col2 > 9999999999.99999  
OR col1 < -9999999999.99999

decimalまたはnumeric列を定義した精度と小数点以下桁数に基づいて値を調整する必要があることに注意してください。 上記の例では、列は col2 decimal(15,5)として定義されています。

Datetime データ型

datetime列の無効な値を含む行を識別するには、2 つの異なるクエリを実行する必要があります。

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

物理的な場所を使用して無効な値を持つ行を検索する

T-SQL メソッドを使用して無効な値を持つ行が見つからない場合は、このメソッドを使用できます。 2570 エラー メッセージでは、無効な値を含む行の物理的な場所が出力されます。 たとえば、次のメッセージを確認します。

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. 

このメッセージには、 Page (1:157), slot 0が表示されます。 行を識別するために必要な情報です。 FileId1され、PageInFile157され、SlotId0

この情報を取得したら、次のコマンドを実行する必要があります。

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

Note

このコマンドは、ページの内容全体を出力します。 DBCC PAGE コマンドのパラメーターは次のとおりです。

  • Database name: データベースの名前。
  • File number: データベース ファイルのファイル番号。
  • Page number: 調べるページの番号。
  • Print option: 出力の詳細レベルを決定する省略可能なパラメーター。

このコマンドを実行すると、次の形式のような情報を含む出力が表示されます。

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

この出力では、目的の行の列値を明確に確認できます。 この場合は、ページの slot 0 に格納されている行が必要です。 エラー メッセージから、 col2 が問題の問題であることがわかります。 そのため、Slot 0col1の値を取得し、update ステートメントまたは delete ステートメントのWHERE句の述語として使用できます。

警告

最初の方法 (つまり、T-SQL クエリを使用して必要な情報を検索する) を使用することをお勧めします。 DBCC PAGE コマンドは、最後の手段としてのみ使用します。 運用環境でこのコマンドを使用する場合は、細心の注意を払います。 テスト サーバーで運用データベースを復元し、 DBCC PAGEを使用して必要なすべての情報を取得してから、運用サーバーで更新を行うことをお勧めします。 常に、問題が発生した場合に備えてバックアップの準備を整え、データベースの以前のコピーに戻す必要があります。

関連項目