用T-SQL怎么把文本文件导入到数据库中?

时间:2022-09-19 22:31:22
文本文件是在服务器上的,不需要远程导入。
用T-SQL怎么实现?请指教,谢谢

8 个解决方案

#1


eg:

--導入文本
Create Table TEST(A Int, B Int)

Select * From TEST

BULK Insert dbo.TEST
From 'd:\TEST.txt'
WITH ( 
    FIELDTERMINATOR ='  ', 
    ROWTERMINATOR ='\n'


Select * From TEST

Drop Table TEST

#2


--来自邹老大的代码,楼主参考一下



if exists(select 1 from sysobjects where name='File2Table' and objectproperty(id,'IsProcedure')=1)
drop procedure File2Table
go

/*--实现数据导入/导出的存储过程

可以实现导入/导出 整个数据库/指定表 到文本文件

--邹建 2003.07(引用请保留此信息)--*/

/*--调用示例

--导出指定表
exec file2table @tbname=N'jobs,pub_info',@filename='c:\[@tbname].txt'

--导出所有表
exec file2table @filename='c:\[@dbname]_[@tbname].txt'

--导入所有表
exec file2table @filename='c:\[@dbname]_[@tbname].txt',@isout=0
--*/
create procedure File2Table
@tbname nvarchar(4000)='',   --表名列表,如果不指定,则表示所有用户表
@filename nvarchar(1000)='', --导出的文件名,如果不指定,导出到SQL Server的默认备份目录\[@dbname]_[@tbname].txt,其中[@dbname]在处理中会替换为数据库名,[@dbname]会用表名代替
@isout bit=1,                --1为导出(默认),0为导入
@username sysname='',        --用户名,如果sql不允许使用NT验证方式登录,则必须指定
@password sysname='',        --密码
@code char(1)=N'N'           --文件编码,可以是n,c,N,W,作用参考bcp语法(如果是数据传输需要,建议用N)
as
declare @s nvarchar(4000)

if isnull(@code,N'') not in(N'n',N'c',N'N',N'W')
set @code='N'

--备份文件名
if isnull(@filename,N'')=N''
begin
select top 1 @filename=rtrim(reverse(filename)) 
from master.dbo.sysfiles 
where name=N'master'
select @filename=stuff(@filename,1,charindex('\',@filename),N'')
,@filename=reverse(stuff(@filename,1,charindex('\',@filename),N''))
+N'\BACKUP\'+db_name()+N'_[@tbname].txt'
end
else
set @filename=replace(@filename,N'[@dbname]',db_name())

declare tb cursor local
for
select N'bcp "'+db_name()
+N'.'+quotename(user_name(uid))
+N'.'+quotename(name)
+N'"'
+case when @isout=1 then N' out' else N' in' end
+N' "'
+replace(@filename,N'[@tbname]',name)
+N'" /'+@code
+case when isnull(@username,N'')=N'' then N' /T'
else N' /U"'+@username
+N'" /P"'+isnull(@password,N'')+N'"'
end
from sysobjects
where xtype=N'U' and status>=0
and(isnull(@tbname,N'')=''
or charindex(','+name+',',','+@tbname+',')>0)
open tb
fetch tb into @s
while @@fetch_status=0
begin
exec master..xp_cmdshell @s,no_output
fetch tb into @s
end
close tb
deallocate tb
go

#3


上面两个试了都不行。
txt文件里面就是一行一个数据,没有分隔符。
还有没有办法呀

#4


1. 文件内容帖出来
2. 说清楚文件存储用的编码.
3. 说清楚目标表结构(即导入处理的需求)

#5


另外, 说明你的 sql 版本

#6


EXEC master..xp_cmdshell 'bcp Northwind..a in c:\aa.txt -c -S tao -U "sa" -P ""'
预先建好表结构,

#7


exec master..xp_readerrorlog -1,'d:\aa.txt'

#8


EXEC master..xp_cmdshell 'bcp sbdb.dbo.NewsType in "c:\test12.txt" -c -q -S"你的服务器名称" -U"你的帐号" -P"你的密码"'

#1


eg:

--導入文本
Create Table TEST(A Int, B Int)

Select * From TEST

BULK Insert dbo.TEST
From 'd:\TEST.txt'
WITH ( 
    FIELDTERMINATOR ='  ', 
    ROWTERMINATOR ='\n'


Select * From TEST

Drop Table TEST

#2


--来自邹老大的代码,楼主参考一下



if exists(select 1 from sysobjects where name='File2Table' and objectproperty(id,'IsProcedure')=1)
drop procedure File2Table
go

/*--实现数据导入/导出的存储过程

可以实现导入/导出 整个数据库/指定表 到文本文件

--邹建 2003.07(引用请保留此信息)--*/

/*--调用示例

--导出指定表
exec file2table @tbname=N'jobs,pub_info',@filename='c:\[@tbname].txt'

--导出所有表
exec file2table @filename='c:\[@dbname]_[@tbname].txt'

--导入所有表
exec file2table @filename='c:\[@dbname]_[@tbname].txt',@isout=0
--*/
create procedure File2Table
@tbname nvarchar(4000)='',   --表名列表,如果不指定,则表示所有用户表
@filename nvarchar(1000)='', --导出的文件名,如果不指定,导出到SQL Server的默认备份目录\[@dbname]_[@tbname].txt,其中[@dbname]在处理中会替换为数据库名,[@dbname]会用表名代替
@isout bit=1,                --1为导出(默认),0为导入
@username sysname='',        --用户名,如果sql不允许使用NT验证方式登录,则必须指定
@password sysname='',        --密码
@code char(1)=N'N'           --文件编码,可以是n,c,N,W,作用参考bcp语法(如果是数据传输需要,建议用N)
as
declare @s nvarchar(4000)

if isnull(@code,N'') not in(N'n',N'c',N'N',N'W')
set @code='N'

--备份文件名
if isnull(@filename,N'')=N''
begin
select top 1 @filename=rtrim(reverse(filename)) 
from master.dbo.sysfiles 
where name=N'master'
select @filename=stuff(@filename,1,charindex('\',@filename),N'')
,@filename=reverse(stuff(@filename,1,charindex('\',@filename),N''))
+N'\BACKUP\'+db_name()+N'_[@tbname].txt'
end
else
set @filename=replace(@filename,N'[@dbname]',db_name())

declare tb cursor local
for
select N'bcp "'+db_name()
+N'.'+quotename(user_name(uid))
+N'.'+quotename(name)
+N'"'
+case when @isout=1 then N' out' else N' in' end
+N' "'
+replace(@filename,N'[@tbname]',name)
+N'" /'+@code
+case when isnull(@username,N'')=N'' then N' /T'
else N' /U"'+@username
+N'" /P"'+isnull(@password,N'')+N'"'
end
from sysobjects
where xtype=N'U' and status>=0
and(isnull(@tbname,N'')=''
or charindex(','+name+',',','+@tbname+',')>0)
open tb
fetch tb into @s
while @@fetch_status=0
begin
exec master..xp_cmdshell @s,no_output
fetch tb into @s
end
close tb
deallocate tb
go

#3


上面两个试了都不行。
txt文件里面就是一行一个数据,没有分隔符。
还有没有办法呀

#4


1. 文件内容帖出来
2. 说清楚文件存储用的编码.
3. 说清楚目标表结构(即导入处理的需求)

#5


另外, 说明你的 sql 版本

#6


EXEC master..xp_cmdshell 'bcp Northwind..a in c:\aa.txt -c -S tao -U "sa" -P ""'
预先建好表结构,

#7


exec master..xp_readerrorlog -1,'d:\aa.txt'

#8


EXEC master..xp_cmdshell 'bcp sbdb.dbo.NewsType in "c:\test12.txt" -c -q -S"你的服务器名称" -U"你的帐号" -P"你的密码"'