带有命名字段参数的批量插入

时间:2012-05-04 03:37:13

标签: sql-server-2008 bulkinsert

通过我的ASP.NET / SQL Server 2008应用程序,我需要从CSV文件(可能是一百万条记录)批量插入记录。我会先将它们导入到临时表中,这样我就可以在将数据移动到永久表之前对其进行操作。

这将定期发生。多次进口可能同时发生。我还必须告诉其他人的每一个进口。

我原来的计划是使用一个包含Import_ID的列。但我发现批量插入不允许我设置字段值。

进行搜索,我发现我可以在视图中进行批量插入。我猜这个视图可以有一个命名参数(Import_ID)。但我还没有真正学会设置参数,所以我不知道这是否可能,或者如何做到。

有人可以告诉我怎么做,或让我知道另一种解决方案吗?

由于

1 个答案:

答案 0 :(得分:2)

您可以批量插入临时临时表,例如,因为您知道您的SPID(并假设您可以信任某些静态表的模式),您可以这样说,指定CSV文件的@filepath和@ImportID,创建一个以会话ID作为后缀的表,并在单个动态SQL批处理中完成所有工作:

DECLARE @sql NVARCHAR(MAX), @spid VARCHAR(12) = RTRIM(@@SPID);

SET @sql = N'SELECT * INTO dbo.Stage' + @spid 
    + ' FROM dbo.RealStagingTable WHERE 1 = 0;';

SET @sql += N'BULK INSERT dbo.Stage' + @spid + ' FROM ('''
    + @filepath + ''' WITH (options);'

SET @sql += N'INSERT dbo.RealTable(ImportID, other columns)
  SELECT ' + RTRIM(@ImportID) + , other columns
  FROM dbo.Stage' + @spid + ';';

SET @sql += N'DROP TABLE dbo.Stage' + @spid + ';'

EXEC sp_executesql @sql;