ストアド プロシージャ内の親テーブルと子テーブルへの効率的なデータの入力
このドキュメントでは、データ入力にユーザー定義テーブル タイプ (UDT) を利用して、ストアド プロシージャ内の親テーブルと子テーブルにデータを効率的に挿入するソリューションの概要を説明します。 このアプローチは、データの整合性を維持し、行ごとの操作に伴うパフォーマンスのボトルネックを回避するという課題に対処します。
課題: データの整合性とパフォーマンス
課題は、UDT からのデータをストアド プロシージャ内の複数の関連テーブル (親テーブルとそれに関連付けられた子テーブル) に正確にマッピングすることにあります。 単純な行ごとの挿入は、特に大規模なデータセットを扱う場合、非効率的でエラーが発生しやすい可能性があります。
解決策: 複数段階のアプローチ
このソリューションは、効率とデータの整合性の両方を確保するために複数のステップのプロセスを採用しています:
UDT の拡張: 一時 ID 列 (temp_id
) を UDT に追加します。これは、UDT 内の各行の一意の識別子として機能し、挿入プロセス全体でデータを追跡するために重要です。
親テーブルの挿入に MERGE
を使用する: MERGE
ステートメントは、親テーブル (@MainEmployee
) にデータを効率的に挿入します。 重要なことに、その OUTPUT
句は一時 ID (UDT からの temp_id
) と親テーブルから新しく生成された EmployeeID
の両方をキャプチャします。
マッピング テーブルの作成: OUTPUT
ステートメントからの MERGE
データにより、一時マッピング テーブル (@EmployeeidMap
) が設定されます。このテーブルは、一時的な temp_id
を親テーブルで生成された実際の EmployeeID
にリンクします。
ID マッピングを使用した親テーブルの作成: 次に、@EmployeeidMap
テーブルを使用して UDT データを親テーブル (@ParentEmployeeDepartment
) に結合し、正しい EmployeeID
が各親に割り当てられるようにします。記録します。
子テーブルの作成: 最後に、@ChildEmployeeDepartmentTypeA
テーブルと @ChildEmployeeDepartmentTypeB
テーブルの両方との結合を使用して、子テーブル (@EmployeeidMap
、@ParentEmployeeDepartment
) にデータが設定されます。これにより、親レコードと子レコードの間に必要な関係が確立されます。
コード例:
次のコードは、この強化されたアプローチを示しています。
<code class="language-sql">CREATE TYPE dbo.tEmployeeData AS TABLE ( FirstName NVARCHAR(50), LastName NVARCHAR(50), DepartmentType NVARCHAR(10), DepartmentBuilding NVARCHAR(50), DepartmentEmployeeLevel NVARCHAR(10), DepartmentTypeAMetadata NVARCHAR(100), DepartmentTypeBMetadata NVARCHAR(100), temp_id INT IDENTITY(1,1) -- Added temporary ID column ) GO CREATE PROC dbo.EmployeeImport (@tEmployeeData dbo.tEmployeeData READONLY) AS BEGIN -- ... (Temporary table declarations remain the same as in the original example) ... -- MERGE into @MainEmployee table MERGE INTO @MainEmployee USING @tEmployeeData AS sourceData ON 1 = 0 WHEN NOT MATCHED THEN INSERT (FirstName, LastName) VALUES (sourceData.FirstName, sourceData.LastName) OUTPUT sourceData.temp_id, inserted.EmployeeID INTO @EmployeeidMap; -- ... (Remaining INSERT statements adjusted to use @EmployeeidMap for joining) ... END GO</code>
この洗練された戦略により、効率的かつ正確なデータ挿入が保証され、潜在的に大規模なデータセットを効果的に処理しながら、親テーブルと子テーブル間の参照整合性が維持されます。
以上がストアド プロシージャでユーザー定義のテーブル タイプを使用して、親テーブルと子テーブルにデータを効率的に挿入するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。