SQL Server 2005 ROW_NUMBER() での ORDER BY の回避
あるテーブルから別のテーブルにデータを挿入するときは、自動インクリメントすることが望ましいことがよくあります。ターゲットテーブル内の非アイデンティティ列。これを実現するには ROW_NUMBER() 関数を使用できますが、通常は ORDER BY フィールドが必要です。ただし、ソース テーブルの元の順序を保持する必要がある場合は、別のアプローチを見つける必要があります。
明示的な順序付けを回避するソリューションには、次のコードが含まれます。
INSERT dbo.TargetTable (ID, FIELD) SELECT Row_Number() OVER (ORDER BY (SELECT 1)) + Coalesce( (SELECT Max(ID) FROM dbo.TargetTable WITH (TABLOCKX, HOLDLOCK)), 0 ), FieldValue FROM dbo.SourceTable WHERE {somecondition};
このコードウィンドウ関数を利用して定数値に基づいて行番号を計算し、ORDER BY 句の必要性を効果的に置き換えます。さらに、同時実行性の問題を防ぐために、クエリではターゲット テーブルの最大値を計算する際にロック ヒント (TABLOCKX および HOLDLOCK) が使用されます。
このアプローチでは順序の明示的な指定は回避されますが、そうではないことに注意することが重要です。ソーステーブルの元の順序が保持されることは保証されません。外部クエリの順序などの要因が結果に影響を与える可能性があります。データベースの観点から見ると、「元の順序を保持する」という概念は実際には存在しません。
最適な同時実行性とデータの整合性を確保するには、この回避策よりも ID 列の使用を強くお勧めします。絶対に必要な場合を除き、ロック ヒントによる排他的テーブル ロックは避けてください。
以上がROW_NUMBER() で ORDER BY を使用せずに SQL Server 2005 で非 ID 列を自動インクリメントするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。