Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 带外键参数的SQL Server大容量插入(txt文件中不存在,包括ERDs)_Sql Server_Bulkinsert_Erd - Fatal编程技术网

Sql server 带外键参数的SQL Server大容量插入(txt文件中不存在,包括ERDs)

Sql server 带外键参数的SQL Server大容量插入(txt文件中不存在,包括ERDs),sql-server,bulkinsert,erd,Sql Server,Bulkinsert,Erd,好的,我有一张桌子,ERD的设计是这样的。。。对于常规批量插入 (来源:) 以及一个以制表符分隔的\t文本文件,其中包含每个客户的信息(由大约100000多条记录组成) 以及一个存储过程,它当前可以很好地完成预期的工作 CREATE PROCEDURE import_customer_from_txt_para @filelocation varchar(100) AS BEGIN TRUNCATE TABLE dbo.[customer_stg] DECLARE @sql

好的,我有一张桌子,ERD的设计是这样的。。。对于常规批量插入


(来源:)

以及一个以制表符分隔的
\t
文本文件,其中包含每个客户的信息(由大约100000多条记录组成)

以及一个存储过程,它当前可以很好地完成预期的工作

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\u表
customer\u stg
之间的关系是否可以在
customer\u stg
批量插入中包含客户id?像这样的事?(我不知道如何将外键参数
@customer_sk
应用于批量插入)

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



(来源:)

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

我认为有两种解决方法:
-如果您有此能力,可以在运行大容量插入之前对文本文件进行宏编辑。因为我假设这不是问题…
-首先,如果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。但是,当您可以使用上述解决方案时,我绝对不建议您这样做


请参阅更多信息:

我不确定在使用文本文件之前编辑它是否可行,因为文本文件平均每个文件有100000条记录(最多100万条记录),因此它大大增加了导入时间。但是我喜欢你的建议。是的,根据文件的大小、系统的可用RAM等,这可能会很困难。。但是,很多文本编辑器都可以让您记录一个可以快速完成的宏,或者如果数据格式良好(希望是窄列),您可以在100000行中使用alt+shift(或等效的非Windows热键)几乎立即完成。如果有任何问题,您可以使用SQL方法。哦,这是会重复的还是一次性的?我最初的印象是这只是一次,但如果重复,编辑文件可能会随着时间的推移付出更多的努力。
CREATE TABLE dbo.#Temp_STG
(
    columnA,
    columnB,
    columnC
)
INSERT dbo.Customer_STG
SELECT
    T.columnA,
    T.columnB,
    T.columnC,
    [your customer key]
FROM dbo.#Temp_STG AS T