0

さて、私はそのように設計されたテーブルERDを持っています...通常の一括挿入用

customer_table_to_customer_stg
(出典: iforce.co.nz )

また、各顧客に関する情報を含むタブ区切りの\tテキスト ファイル (約 100,000 件以上のレコードで構成されています)。

# columnA columnB columnC
data_pointA data_pointB data_pointC

そして、現在意図した仕事をうまくやっているストアドプロシージャ。

CREATE PROCEDURE import_customer_from_txt_para @filelocation varchar(100)
AS BEGIN

    TRUNCATE TABLE dbo.[customer_stg]
    DECLARE @sql nvarchar(4000) = '
    BULK INSERT customer_stg
    FROM ''' + @filelocation + '''
    WITH
    (
        FIRSTROW=14,
        FIELDTERMINATOR=''\t'',
        ROWTERMINATOR=''\n''
    )';
    print @sql;
    exec(@sql);

END

しかし、私の質問は、一括挿入内に customer_idcustomer_tablecustomer_stg含めることは可能ですか? customer_stgそのようなもので?@customer_sk(外部キーパラメータを一括挿入に適用する方法がわかりません)。

CREATE PROCEDURE import_customer_from_txt_para @filelocation varchar(100), @customer_sk int
AS BEGIN

    TRUNCATE TABLE dbo.[customer_stg]
    DECLARE @sql nvarchar(4000) = '
    BULK INSERT customer_stg
    FROM ''' + @filelocation + '''
    WITH
    (
        FIRSTROW=14,
        FIELDTERMINATOR=''\t'',
        ROWTERMINATOR=''\n''
    )';
    print @sql;
    exec(@sql);

END

できれば、一括挿入するたびに、2 つのテーブル間でデータを関連付けることができるようにしたいと考えています。

customer_table_to_customer_stg_RS
(出典: iforce.co.nz )

4

1 に答える 1

2

一括挿入は、NULL または指定されていない列のデフォルト値 (KEEPNULLS 引数に基づく) のいずれかを挿入しますが、これはもちろん、制約がある (または作成する) と仮定すると、状況では機能しません。そうしないと、挿入を実行した直後にテーブルを更新することができるため、これが当てはまると思います。

これには 2 つの方法があります。
- 能力があれば、一括挿入を実行する前にテキスト ファイルをマクロ編集できます。私はそれが問題ではないと仮定しているので...
- まず第一に、FK 列を _stg テーブルにまだ追加していない場合は追加する必要があります。次に、ストアド プロシージャで、入力ファイルで指定された 3 つの列を含む一時テーブルを作成します。

CREATE TABLE dbo.#Temp_STG
(
    columnA,
    columnB,
    columnC
)

次に、そのテーブルに一括挿入します。次に、一時テーブルからメインの _stg テーブルに挿入できますが、列を追加します。

INSERT dbo.Customer_STG
SELECT
    T.columnA,
    T.columnB,
    T.columnC,
    [your customer key]
FROM dbo.#Temp_STG AS T

完了したら、必ず一時テーブルを削除してください。

ちなみに、このタスクには動的 SQL を使用する必要がありますか? 絶対に必要でない限り、一般的には避けるのが最善です。

別のオプションは、列のデフォルト値を希望する値に設定し、KEEPNULLS をオフにすることだと思います。ただし、上記のソリューションを使用できる場合は、これを行うことは絶対にお勧めしません。

詳細: http://msdn.microsoft.com/en-us/library/ms188365.aspx

于 2013-01-23T00:21:09.597 に答える