扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:csdn 来源:csdn 2009年12月18日
关键字: MS-SQL Server 问答
求sql导入语句
我有500多个csv文件,想导入SQL数据库内,数据库字段与文件字段是一样的,
如何写批量导入语句。
用动态sql
--以下是别人写的,
--第一步,先获取某一个文件夹下的所有txt 文件
create table tmp_filelist (cdrfile varchar(64))
go
exec master.dbo.xp_cmdshell 'dir D:\data.db\4006\400. <YYYYMM>\*.txt /s/b > D:\data.db\4006\400. <YYYYMM>\list'
-- -s:表示该文件夹下所有文本文件,包括子文件夹
-- -b:当前文件夹所有文本文件
-- >:表示把当前文件列表存入指定的文件中
go
bulk insert tmp_filelist from N'D:\data.db\4006\400. <YYYYMM>\list'
--用药bulk insert 命令把文件列表的文件名存入 数据表中
go
--第二步,利用游标把每一文件导入数据库中
--他这里是用bulk insert ,也可以用
--select * from opendatasource('microsoft.jet.oledb.4.0','text;hdr=no;database=路径')...[文件名#txt]
truncate table tmp_cdr4006csv
declare @cdrfile varchar(64)
declare @sql nvarchar(256)
declare @cmd varchar(512)
declare cur_fl cursor for select * from tmp_filelist
open cur_fl
fetch next from cur_fl into @cdrfile
while @@fetch_status!=-1 begin
set @sql ='BULK INSERT tmp_cdr4006csv FROM N'''+@cdrfile+''' WITH ( FIELDTERMINATOR = '','')' exec sp_executesql @sql
fetch next from cur_fl into @cdrfile
end
close cur_fl
deallocate cur_fl
declare @count int,@path varchar(200),@tb varchar(100),@cmd nvarchar(4000)
set @count =500
set @path='D:\abc\'--a100.csv
set @count=1
whiel @count <=600
begin
set @cmd='bcp '+@path + 'a'+cast(@count as varchar)+'.csv in '+@tb+' -c -t, -T'
exec master.dbo.xp_cmdshell @cmd
set @count=@count=1
end
SQL codeif exists(select 1 from sysobjects where name='file2table' and objectproperty(id,'isprocedure')=1)
drop procedure file2table
go
create procedure file2table
@servername varchar(200) --服务器名称
,@username varchar(200) --用户名,如果用nt验证方式,则为空''
,@password varchar(200) --密码
,@tbname varchar(500) --数据库
,@filename varchar(1000) --导入/导出路径/文件名,如果@tbname参数指明是导出整个数据库,则这个参数是文件存放路径,文件名自动用表名.txt
,@isout bit --1为导出,0为导入
as
declare @sql varchar(8000)
------如果@tbname参数为ksoa类型,则默认导出整个数据库中的数据,如果@tbname参数为ksoa..spkfk则默认导出某个表的数据
begin --导出整个数据库,定义游标,取出所有的用户表
declare @m_tbname varchar(250)
if right(@filename,1)<>'\' set @filename=@filename+'\'--如果不是文件夹根目录,设置为根目录
set @m_tbname='declare #tb cursor for select name from '+@tbname+'.dbo.sysobjects where xtype=''u''
and (name not like ''wms_%'' and name not like ''HR_%'' and name not like ''tmp_%'')'
exec(@m_tbname)
open #tb
fetch next from #tb into @m_tbname
while @@fetch_status=0
begin
set @sql='bcp '+@tbname+'.'+'dbo.'+@m_tbname+case when @isout=1 then ' out ' else ' in ' end
+ @filename+@m_tbname+'.csv -w' -- 注意
+' /S '+@servername +case when isnull(@username,'')='' then '' else ' /U '+@username end
+' /P '+isnull(@password,'')
exec master.dbo.xp_cmdshell @sql
fetch next from #tb into @m_tbname
end
close #tb
deallocate #tb
end
go
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者