2010-10-12 50 views
3

csv文件包含8列(col1,col2,...,col8),并且文件的名称也包含必须插入表中的日期。带有额外列的sql批量插入

如果表和列在CSV文件中的列数相等,则下面的查询进口的所有记录从文件表:

query += "BULK INSERT real_data FROM '" + path + "' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n')"; 

到目前为止,我还没有找到一个解决方案修改查询,以便新记录可以包含从文件名中提取的日期。无论如何,我已经创建了一个函数抽取日期:

DateTime eventTime = extractDate(path); 

,并想插入EVENTTIME到第9列从文件导入的每个记录。

有谁知道如何修改/创建查询语句从文件中导入8列,并将日期添加为每个导入记录的第9列?

谢谢!

回答

5

您不能在使用BULK INSERT命令加载的数据集中添加“任意列”。 (SSIS包可以做到这一点,如果你要处理的复杂性。)

下面的技巧是有点复杂,但我已经用它成功地几次:

  • 确定的名称(例如,MyDate和'Jan 1,1980')
  • 基于该表创建(临时)缺省值(ATLER TABLE MyTable add constraint DF_TempLoad default'1980年1月1日'为MyDate [检查语法,它可能关闭]
  • 在选项卡上创建(临时)视图le,仅列出要批量插入的列
  • 对视图运行BULK INSERT;未包括在视图中的列将被分配默认值
  • 删除视图
  • 删除默认约束。
+1

我也用过这个。注意:如果你已经建立了一个实用程序,它将按顺序加载多个文件,即使使用'(nolock)'从MyTable中选择count(*)“,也不能”监视“表加载。你必须在'ALTER TABLE'部分建立一个可靠的重试方法,因为它需要独占访问表。 – 2016-06-16 14:38:01

+1

注意:如果您可以使用bcp格式文件,则不需要使用临时视图。 – 2016-06-16 14:39:10