【问题标题】:Bulk Insert with Named Field Parameter使用命名字段参数批量插入
【发布时间】:2012-05-04 03:37:13
【问题描述】:

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

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

我最初的计划是使用其中包含 Import_ID 的列。但我看到批量插入不允许我设置字段值。

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

有人可以告诉我如何做到这一点,或者让我知道另一种解决方案吗?

谢谢

【问题讨论】:

  • 视图不带参数。你能指出你在哪里读到的吗?
  • 我没看过。我假设它。我更熟悉 Access,我可以在视图中放入命名参数。

标签: sql-server-2008 bulkinsert


【解决方案1】:

您可以批量插入临时临时表,例如,因为您知道您的 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;

【讨论】:

  • 我还不太了解 SP,但我想我明白你在做什么。但是使用 SPID 不会每次都给我相同的数字吗?
  • 但它确实告诉我,我可以通过 SQL 语句中的代码手动执行相同的操作。但我不会使用 SPID,而是使用 Import_ID。这可能不是最有效的方法(我实际上打赌它不是),但我现在非常紧张,我想我会使用它并继续前进。谢谢。
  • 是的,我认为 Import_ID 更有意义,但也没有两个用户可以同时作为同一个 spid 运行。
  • 那么SSIP是基于会话的吗?
  • 顺便说一句,我喜欢复制您在第一个查询中使用的表模式的技巧。
猜你喜欢
  • 2011-11-10
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
相关资源
最近更新 更多