ORDER BY を使用しない SQL Server 2005 での自動インクリメント ID の生成
自動インクリメント中に、あるテーブルから別のテーブルにデータを挿入する必要性ID 以外の列は困難になる可能性があります。標準的なアプローチには、カーソルの使用またはテーブル変数の作成が含まれますが、これらは非効率的な場合があります。
正当な ORDER BY フィールドがない場合は、ROW_NUMBER 関数を使用できます。ただし、明示的な順序付けがないからといって、元のデータの順序が保持されることは保証されません。これは、「順序付けされていない」ことと「元の順序を保持している」ことは異なるためです。
この問題に対処するには、次のように明示的な順序付けを避けることが解決策となります。
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};
このアプローチでは、最大値が計算されます。同時実行エラーを回避するために、ロックの取得中にデータを ID 化して挿入します。
ただし、ロックやロックの必要性がなくなるため、ID 列を使用することを強くお勧めします。最適な同時実行性を保証します。 ID 列は、SQL Server で ID を自動インクリメントするための、より効率的かつ堅牢なソリューションを提供します。
以上がSQL Server 2005 で ORDER BY を使用せずに非 ID 列を自動インクリメントするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。