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 列を使用することを強くお勧めします。ロックに使用し、最適な同時実行性を保証します。 ID 列は、SQL Server で ID を自動インクリメントするための、より効率的かつ堅牢なソリューションを提供します。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3