|
前不久在某个论坛(ExcelHome)上有人问,能否批量导入数据到SQL server?虽然之前也有数据同步的情况,但需要导入文件的情况极少,所以也就手动按向导完成罢了。
这么一问,倒是把我问到了。终于今天得闲,就抽空去微软官网看看。导入大概有三种方式。一种是bcp,一种是bulk insert,另一种则是openrowset。
bcp只能对最简单的格式进行导入,不能指定表头(或许我没找到这方面的例子吧)。而openrowset则通常需要格式化文件(fmt)或者指定数据库链接引擎(例如,access)等参数,对于文本文件,bulk insert似乎更简单一些。所以这里只谈谈bulk insert。
按惯例,先上代码。
- CREATE PROC [dbo].[import_data] @start_date date='2020-07-01', @end_date date='2020-07-31'
- AS
- BEGIN
- DECLARE @file_name varchar(100)--文件名
- DECLARE @day_num int--天数
- DECLARE @date date--日期变量
- DECLARE @i int--序号变量
- DECLARE @tmp_table table(is_file_exists int,is_path int,is_parent_exists int)--文件信息变量表,字段1:是否存在文件。字段2:是否文件夹,字段3:父级路径是否存在
- DECLARE @str_sql varchar(500)--SQL语句拼接
- --初始化起止日期天数,用于确定循环上限
- SET @day_num=DATEDIFF(day,@start_date,@end_date)
- --初始化日期变量。
- SET @date=@start_date
- SET @i=0
- WHILE @i<=@day_num
- BEGIN
- SET @file_name='E:\AppData\Local\'+convert(varchar(8),@date,112)+'.csv'
- INSERT INTO @tmp_table EXEC [MASTER]..XP_FILEEXIST @file_name --把文件信息插入文件信息变量表
- IF EXISTS(SELECT * FROM @tmp_table WHERE is_file_exists=1) --如果文件存在,则拼接SQL语句
- SET @str_sql= 'BULK INSERT v_test FROM '''+@file_name
- +''' WITH (FIRSTROW=2,FIELDTERMINATOR='','')'
- ELSE --否则就跳出循环
- BREAK
-
- delete from test where import_date=@date --如果已经导入,则删除数据
- EXEC(@str_sql) --导入数据
- update test set import_date=@date where import_date is null --添加导入日期
- DELETE FROM @tmp_table --删除文件信息变量表。注意,这里可不能truncate。
- SET @i=@i+1 --循环累计
- SET @date=DATEADD(day,@i,@start_date) --重设日期变量
- END
- END
复制代码
先说下基本格式:
BULK INSERT 表名(或视图名)'C:\测试.csv' WITH (FIRSTROW=2,FIELDTERMINATOR=',')
说明:
FIRSTROW=2:可选(默认情况下从第一行导入)。这里表示从第二行导入。
FIELDTERMINATOR=',':必选,表示csv分割符为逗号。SQL server 2017版本【即版本号为14以上】以后可以用FORMAT='CSV'代替这一句。
版本号查看请参考下图:
附件如下:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
评分
-
查看全部评分
|