Share via


行サイズのエラーのトラブルシューティング

SQL Server データベース エンジンでは、式を評価する前に並べ替え操作が行われることがあります。そのため、SQL Server 2000 で動作するクエリの中には、SQL Server 2008 でエラーを返すものがあります。エラーとなるクエリは、一般に次の指定を行っています。

  • 結果セット内に、非常に長い char フィールド、nchar フィールド、varchar フィールド、および nvarchar フィールドがあります。

  • ORDER BY 句、GROUP BY 句、DISTINCT 句など、データベース エンジンが並べ替え操作を開始する原因となる句があります。また、JOIN 句がある場合も、SQL Server のクエリ オプティマイザは、並べ替えが必要な Merge Join アルゴリズムを使用して解決しようとします。

データベース エンジンは、クエリ内の他の式を評価する前に並べ替え操作を行う場合があります。そのためにデータベース エンジンでは、中間結果を格納するための作業テーブルを作成することが必要になります。この作業テーブルで 8,060 バイトの制限を超える行を作成する必要がある場合、クエリはエラーを返します。

たとえば、次のテーブルがあるとします。

USE tempdb;
GO
CREATE TABLE t1
    (ch char(6000), vch1 varchar(100), vch2 varchar(100), vch3 varchar(100));
CREATE TABLE t2(i int);
GO
INSERT t1 VALUES(REPLICATE('abc', 2000), 
    '123456789012345678901234567890', '123456789012345678901234567890',
    '123456789012345678901234567890');
INSERT t2 VALUES(7);
INSERT t2 VALUES(13);
GO

USE tempdb;
GO
CREATE TABLE t1
    (ch char(6000), vch1 varchar(100), vch2 varchar(100), vch3 varchar(100));
CREATE TABLE t2(i int);
GO
INSERT t1 VALUES(REPLICATE('abc', 2000), 
    '123456789012345678901234567890', '123456789012345678901234567890',
    '123456789012345678901234567890');
INSERT t2 VALUES(7);
INSERT t2 VALUES(13);
GO

ここで、次のクエリについて考えてみます。このクエリは SQL Server 2000 では動作しますが、SQL Server 2008 ではエラーを返します。

SELECT ch+ch, vch1, vch2, vch3 
FROM t1, t2 
ORDER BY vch1, i;
GO

SELECT ch+ch, vch1, vch2, vch3 
FROM t1, t2 
ORDER BY vch1, i;
GO

このクエリが SQL Server 2008 でエラーになるのは、SQL Server 2000 の場合よりも早いタイミングで ORDER BY 句がデータベース エンジンによって評価されるからであり、このクエリでは結果セットで非常に長い char フィールドが要求されるからです。データベース エンジンが構築する作業テーブルでは、1 つ以上の行で 8,060 バイトの制限を超えます。

正常にクエリを実行するには、CAST または CONVERT を使用して、選択リスト内の長いフィールドを varchar(max) データ型または nvarchar(max) データ型に変換します。たとえば、次のクエリは SQL Server 2005 で正常に実行されます。

SELECT CONVERT(varchar(max),ch+ch), vch1, vch2, vch3 
FROM t1, t2 
ORDER BY vch1, i;
GO

SELECT CONVERT(varchar(max),ch+ch), vch1, vch2, vch3 
FROM t1, t2 
ORDER BY vch1, i;
GO