SQL2000数据表中有N行数据,如下所示:
序号 字段A 字段B(Text型)
1 avsdd 大声道撒的萨达倒萨倒萨
2 ueaed 大声道撒倒萨倒萨倒萨倒
..........................
我现在想写一个程序,需要将表中的每一行导出至一个txt文件,同时该文件需要按照 字段A的内容.txt这样的命名规则命名。即第一个TXT文件名称为:avsdd.txt,其中内容为字段B的内容。
请问该如何实现?
18 个解决方案
#1
程序应该好实现点动态命名
#2
那你写个循环,用BCP导出呗。
#3
用游标+BCP
#4
一行数据导出为一个文本有意思吗?!
#5
有可参考的例子吗?
#6
if 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+'.txt -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
----导入整个数据库
exec file2table 'yangxing','sa','','KSOA','E:\Music',1
----导入
exec file2table '127.0.0.1','sa','','ksoa','E:\admin\',1
#7
请问如果数据表中有200万行数据,是不是要生成200万个文件呢?会吓死人的!
#8
多谢,这是历史数据,大概1万多条吧。这次导出后,就不再导出了。
#9
太可怕了!一万个文件!
字段A是惟一的吗?
字段A是惟一的吗?
#10
字段A不是唯一的。
每一个导出的文件大概在10K~20K之间吧。
每一个导出的文件大概在10K~20K之间吧。
#11
/** 导入文本文件 */
EXEC master..xp_cmdshell 'bcp dbname..tablename in c:\DT.txt -c -Sservername -Usa -Ppassword'
/** 导出文本文件 */
EXEC master..xp_cmdshell 'bcp dbname..tablename out c:\DT.txt -c -Sservername -Usa -Ppassword'
或
EXEC master..xp_cmdshell 'bcp "Select * from dbname..tablename" queryout c:\DT.txt -c -Sservername -Usa -Ppassword'
/**导出到TXT文本,用逗号分开*/
exec master..xp_cmdshell 'bcp "库名..表名" out "d:\tt.txt" -c -t ,-U sa -P password'
BULK INSERT 库名..表名
FROM 'c:\test.txt'
WITH (
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n'
)
#12
-------------------------------------------
-- Author : liangCK 小梁
-- Comment: 小梁 爱 兰儿
-- Date : 2009-09-09 16:41:29
-------------------------------------------
--> 生成测试数据: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
CREATE TABLE [tb] (序号 INT,字段A VARCHAR(5),字段B NTEXT)
INSERT INTO [tb]
SELECT 1,'avsdd','大声道撒的萨达倒萨倒萨' UNION ALL
SELECT 2,'ueaed','大声道撒倒萨倒萨倒萨倒'
--SQL查询如下:
DECLARE cur CURSOR FOR
SELECT 序号,字段A FROM tb;
DECLARE @序号 INT,@字段A VARCHAR(20);
DECLARE @cmd NVARCHAR(4000),@i INT;
SET @i = 1;
DECLARE @dir VARCHAR(128); --目标路径
SET @dir = 'E:\';
OPEN cur;
FETCH NEXT FROM cur INTO @序号,@字段A;
WHILE @@FETCH_STATUS=0
BEGIN
SET @cmd = N'bcp "SELECT 字段B FROM tempdb..tb" queryout ' + @dir + @字段A
+ '.txt -S.\SQLExpress -T -c -F' + RTRIM(@i) + ' -L' + RTRIM(@i);
EXEC xp_cmdshell @cmd,NO_OUTPUT;
SET @i = @i + 1;
FETCH NEXT FROM cur INTO @序号,@字段A;
END
CLOSE cur;
DEALLOCATE cur;
--删除测试
DROP TABLE tb;
#13
-S.\SQLExpress 换成你的服务器名称..如果是默认实例,可以不用指定-S
#14
我测试一下,多谢!
#15
sql2000:库名test,表名t,导出目录d:\gg\
CREATE TABLE t(xh INT,a VARCHAR(20),b TEXT)
insert t select 1,'aaaa','大声道撒的萨达倒萨倒萨'
union all select 2,'bbbb' ,'大声道撒倒萨倒萨倒萨倒'
union all select 3,'cccc' ,'大声道f23dfsdfadf撒倒萨倒萨倒萨倒'
exec MASTER.dbo.xp_execresultset 'SELECT ''exec master.dbo.xp_cmdshell ''''bcp "select b from test.dbo.t where xh=''+LTRIM(xh)+ ''" queryout "d:\gg\''+ a+''.txt" -c -Sxxbb -Usa -Psunway''''''
FROM t',
N'test'
#16
都是高手!
#17
TO:liangCK
我在查询分析器中测试了一下,命令执行成功,但是没有在D盘创建文件,D盘是具有写权限的。
我在查询分析器中测试了一下,命令执行成功,但是没有在D盘创建文件,D盘是具有写权限的。
#18
TO:chuifengde
这个执行成功,非常感谢。结贴。
这个执行成功,非常感谢。结贴。
#1
程序应该好实现点动态命名
#2
那你写个循环,用BCP导出呗。
#3
用游标+BCP
#4
一行数据导出为一个文本有意思吗?!
#5
有可参考的例子吗?
#6
if 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+'.txt -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
----导入整个数据库
exec file2table 'yangxing','sa','','KSOA','E:\Music',1
----导入
exec file2table '127.0.0.1','sa','','ksoa','E:\admin\',1
#7
请问如果数据表中有200万行数据,是不是要生成200万个文件呢?会吓死人的!
#8
多谢,这是历史数据,大概1万多条吧。这次导出后,就不再导出了。
#9
太可怕了!一万个文件!
字段A是惟一的吗?
字段A是惟一的吗?
#10
字段A不是唯一的。
每一个导出的文件大概在10K~20K之间吧。
每一个导出的文件大概在10K~20K之间吧。
#11
/** 导入文本文件 */
EXEC master..xp_cmdshell 'bcp dbname..tablename in c:\DT.txt -c -Sservername -Usa -Ppassword'
/** 导出文本文件 */
EXEC master..xp_cmdshell 'bcp dbname..tablename out c:\DT.txt -c -Sservername -Usa -Ppassword'
或
EXEC master..xp_cmdshell 'bcp "Select * from dbname..tablename" queryout c:\DT.txt -c -Sservername -Usa -Ppassword'
/**导出到TXT文本,用逗号分开*/
exec master..xp_cmdshell 'bcp "库名..表名" out "d:\tt.txt" -c -t ,-U sa -P password'
BULK INSERT 库名..表名
FROM 'c:\test.txt'
WITH (
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n'
)
#12
-------------------------------------------
-- Author : liangCK 小梁
-- Comment: 小梁 爱 兰儿
-- Date : 2009-09-09 16:41:29
-------------------------------------------
--> 生成测试数据: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
CREATE TABLE [tb] (序号 INT,字段A VARCHAR(5),字段B NTEXT)
INSERT INTO [tb]
SELECT 1,'avsdd','大声道撒的萨达倒萨倒萨' UNION ALL
SELECT 2,'ueaed','大声道撒倒萨倒萨倒萨倒'
--SQL查询如下:
DECLARE cur CURSOR FOR
SELECT 序号,字段A FROM tb;
DECLARE @序号 INT,@字段A VARCHAR(20);
DECLARE @cmd NVARCHAR(4000),@i INT;
SET @i = 1;
DECLARE @dir VARCHAR(128); --目标路径
SET @dir = 'E:\';
OPEN cur;
FETCH NEXT FROM cur INTO @序号,@字段A;
WHILE @@FETCH_STATUS=0
BEGIN
SET @cmd = N'bcp "SELECT 字段B FROM tempdb..tb" queryout ' + @dir + @字段A
+ '.txt -S.\SQLExpress -T -c -F' + RTRIM(@i) + ' -L' + RTRIM(@i);
EXEC xp_cmdshell @cmd,NO_OUTPUT;
SET @i = @i + 1;
FETCH NEXT FROM cur INTO @序号,@字段A;
END
CLOSE cur;
DEALLOCATE cur;
--删除测试
DROP TABLE tb;
#13
-S.\SQLExpress 换成你的服务器名称..如果是默认实例,可以不用指定-S
#14
我测试一下,多谢!
#15
sql2000:库名test,表名t,导出目录d:\gg\
CREATE TABLE t(xh INT,a VARCHAR(20),b TEXT)
insert t select 1,'aaaa','大声道撒的萨达倒萨倒萨'
union all select 2,'bbbb' ,'大声道撒倒萨倒萨倒萨倒'
union all select 3,'cccc' ,'大声道f23dfsdfadf撒倒萨倒萨倒萨倒'
exec MASTER.dbo.xp_execresultset 'SELECT ''exec master.dbo.xp_cmdshell ''''bcp "select b from test.dbo.t where xh=''+LTRIM(xh)+ ''" queryout "d:\gg\''+ a+''.txt" -c -Sxxbb -Usa -Psunway''''''
FROM t',
N'test'
#16
都是高手!
#17
TO:liangCK
我在查询分析器中测试了一下,命令执行成功,但是没有在D盘创建文件,D盘是具有写权限的。
我在查询分析器中测试了一下,命令执行成功,但是没有在D盘创建文件,D盘是具有写权限的。
#18
TO:chuifengde
这个执行成功,非常感谢。结贴。
这个执行成功,非常感谢。结贴。