CSVファイル情報を1つずつ読み取る必要があります。つまり、ファイル内の顧客が顧客テーブルに存在する場合は詳細テーブルに挿入し、そうでない場合はエラーテーブルに挿入します。そのため、一括挿入方式は使用できません。
CSVファイルから1レコードずつ読み取る方法は?パスを与える方法は?ここでは、一括挿入方式は機能しません。
CSVファイル情報を1つずつ読み取る必要があります。つまり、ファイル内の顧客が顧客テーブルに存在する場合は詳細テーブルに挿入し、そうでない場合はエラーテーブルに挿入します。そのため、一括挿入方式は使用できません。
CSVファイルから1レコードずつ読み取る方法は?パスを与える方法は?ここでは、一括挿入方式は機能しません。
バルクインサートを使用してステージングテーブルにロードし、行ごとに処理します。
1つのオプションは、トリガーを使用して行を正しいテーブルに選択的に配置し、オプションでINSTEAD OF INSERT
通常を使用することです。BULK INSERT
FIRE_TRIGGERS
近いもの;
CREATE TRIGGER bop ON MyTable INSTEAD OF INSERT AS
BEGIN
INSERT INTO MyTable
SELECT inserted.id,inserted.name,inserted.otherfield FROM inserted
WHERE inserted.id IN (SELECT id FROM customerTable);
INSERT INTO ErrorTable
SELECT inserted.id,inserted.name,inserted.otherfield FROM inserted
WHERE inserted.id NOT IN (SELECT id FROM customerTable);
END;
BULK INSERT MyTable FROM 'c:\temp\test.sql'
WITH (FIELDTERMINATOR=',', FIRE_TRIGGERS);
DROP TRIGGER bop;
ファイルを定期的にインポートする場合は、同じスキーマでテーブル(ImportTable)を作成し、その上にトリガーを設定して、へのMyTable
一括インポートを介してインポートを実行できImportTable
ます。そうすれば、トリガーを保持でき、にインポートしている限り、ImportTable
インポートごとに特別なセットアップ/手順を実行する必要はありません。
CREATE TABLE #ImportData
(
CVECount varchar(MAX),
ContentVulnCVE varchar(MAX),
ContentVulnCheckName varchar(MAX)
)
BULK INSERT #ImportData
FROM 'D:\test.csv'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ',', --CSV field delimiter
ROWTERMINATOR = '\n', --Use to shift the control to next row
TABLOCK
)
select * from #ImportData
//Here you can write your script to user read data one by one
DROP TABLE #ImportData