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_id之间customer_table的关系?像这样?(我不确定如何将外键参数应用于批量插入)。customer_stgcustomer_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

最好在每次批量插入之后,我希望能够关联两个表之间的数据。

customer_table_to_customer_stg_RS
(来源:iforce.co.nz

4

1 回答 1

2

批量插入将插入 NULL 或未指定列的默认值(基于 KEEPNULLS 参数),假设您有(或将创建)约束,这当然不适用于您的情况。我认为是这种情况,否则您可以在运行插入后直接更新表。

我看到了两种解决方法:
- 如果您有能力,您可以在运行批量插入之前对文本文件进行宏编辑。因为我假设这不是问题...
- 首先,如果 FK 列不存在,您需要将其添加到您的 _stg 表中。然后,在您的存储过程中,使用输入文件中指定的三列创建一个临时表:

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 回答