SQL 2000 数据表每一行导出为对应的TXT文件

时间:2022-09-21 12:22:36
现在有这样一个需求:
SQL2000数据表中有N行数据,如下所示:

序号  字段A   字段B(Text型)
1     avsdd   大声道撒的萨达倒萨倒萨
2     ueaed   大声道撒倒萨倒萨倒萨倒
..........................

我现在想写一个程序,需要将表中的每一行导出至一个txt文件,同时该文件需要按照 字段A的内容.txt这样的命名规则命名。即第一个TXT文件名称为:avsdd.txt,其中内容为字段B的内容。

请问该如何实现?

18 个解决方案

#1


程序应该好实现点动态命名

#2


那你写个循环,用BCP导出呗。

#3


用游标+BCP

#4


引用楼主 yuanxi88 的回复:
现在有这样一个需求:
SQL2000数据表中有N行数据,如下所示:

序号  字段A  字段B(Text型)
1    avsdd  大声道撒的萨达倒萨倒萨
2    ueaed  大声道撒倒萨倒萨倒萨倒
..........................

我现在想写一个程序,需要将表中的每一行导出至一个txt文件,同时该文件需要按照 字段A的内容.txt这样的命名规则命名。即第一个TXT文件名称为:avsdd.txt,其中内容为字段B的内容。

请问该如何实现?
一行数据导出为一个文本有意思吗?!

#5


引用 2 楼 sdhdy 的回复:
那你写个循环,用BCP导出呗。

有可参考的例子吗?

#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


引用 4 楼 soft_wsx 的回复:
引用楼主 yuanxi88 的回复:
现在有这样一个需求:
SQL2000数据表中有N行数据,如下所示:

序号  字段A  字段B(Text型)
1    avsdd  大声道撒的萨达倒萨倒萨
2    ueaed  大声道撒倒萨倒萨倒萨倒
..........................

我现在想写一个程序,需要将表中的每一行导出至一个txt文件,同时该文件需要按照 字段A的内容.txt这样的命名规则命名。即第一个TXT文件名称为:avsdd.txt,其中内容为字段B的内容。

请问该如何实现?

一行数据导出为一个文本有意思吗?!
请问如果数据表中有200万行数据,是不是要生成200万个文件呢?会吓死人的!

#8


引用 7 楼 soft_wsx 的回复:
引用 4 楼 soft_wsx 的回复:
 引用楼主 yuanxi88 的回复:
 现在有这样一个需求:
 SQL2000数据表中有N行数据,如下所示:

 序号  字段A  字段B(Text型)
 1    avsdd  大声道撒的萨达倒萨倒萨
 2    ueaed  大声道撒倒萨倒萨倒萨倒
 ..........................

 我现在想写一个程序,需要将表中的每一行导出至一个txt文件,同时该文件需要按照 字段A的内容.txt这样的命名规则命名。即第一个TXT文件名称为:avsdd.txt,其中内容为字段B的内容。

 请问该如何实现?

 一行数据导出为一个文本有意思吗?!
请问如果数据表中有200万行数据,是不是要生成200万个文件呢?会吓死人的!

多谢,这是历史数据,大概1万多条吧。这次导出后,就不再导出了。

#9


引用 8 楼 yuanxi88 的回复:
引用 7 楼 soft_wsx 的回复:
引用 4 楼 soft_wsx 的回复:
引用楼主 yuanxi88 的回复:
现在有这样一个需求:
SQL2000数据表中有N行数据,如下所示:

序号  字段A  字段B(Text型)
1    avsdd  大声道撒的萨达倒萨倒萨
2    ueaed  大声道撒倒萨倒萨倒萨倒
..........................

我现在想写一个程序,需要将表中的每一行导出至一个txt文件,同时该文件需要按照 字段A的内容.txt这样的命名规则命名。即第一个TXT文件名称为:avsdd.txt,其中内容为字段B的内容。

请问该如何实现?

一行数据导出为一个文本有意思吗?!
请问如果数据表中有200万行数据,是不是要生成200万个文件呢?会吓死人的!

多谢,这是历史数据,大概1万多条吧。这次导出后,就不再导出了。
太可怕了!一万个文件!
字段A是惟一的吗?

#10


字段A不是唯一的。
每一个导出的文件大概在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


引用 13 楼 liangck 的回复:
-S.\SQLExpress 换成你的服务器名称..如果是默认实例,可以不用指定-S

我测试一下,多谢!

#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盘是具有写权限的。

#18


TO:chuifengde

这个执行成功,非常感谢。结贴。

#1


程序应该好实现点动态命名

#2


那你写个循环,用BCP导出呗。

#3


用游标+BCP

#4


引用楼主 yuanxi88 的回复:
现在有这样一个需求:
SQL2000数据表中有N行数据,如下所示:

序号  字段A  字段B(Text型)
1    avsdd  大声道撒的萨达倒萨倒萨
2    ueaed  大声道撒倒萨倒萨倒萨倒
..........................

我现在想写一个程序,需要将表中的每一行导出至一个txt文件,同时该文件需要按照 字段A的内容.txt这样的命名规则命名。即第一个TXT文件名称为:avsdd.txt,其中内容为字段B的内容。

请问该如何实现?
一行数据导出为一个文本有意思吗?!

#5


引用 2 楼 sdhdy 的回复:
那你写个循环,用BCP导出呗。

有可参考的例子吗?

#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


引用 4 楼 soft_wsx 的回复:
引用楼主 yuanxi88 的回复:
现在有这样一个需求:
SQL2000数据表中有N行数据,如下所示:

序号  字段A  字段B(Text型)
1    avsdd  大声道撒的萨达倒萨倒萨
2    ueaed  大声道撒倒萨倒萨倒萨倒
..........................

我现在想写一个程序,需要将表中的每一行导出至一个txt文件,同时该文件需要按照 字段A的内容.txt这样的命名规则命名。即第一个TXT文件名称为:avsdd.txt,其中内容为字段B的内容。

请问该如何实现?

一行数据导出为一个文本有意思吗?!
请问如果数据表中有200万行数据,是不是要生成200万个文件呢?会吓死人的!

#8


引用 7 楼 soft_wsx 的回复:
引用 4 楼 soft_wsx 的回复:
 引用楼主 yuanxi88 的回复:
 现在有这样一个需求:
 SQL2000数据表中有N行数据,如下所示:

 序号  字段A  字段B(Text型)
 1    avsdd  大声道撒的萨达倒萨倒萨
 2    ueaed  大声道撒倒萨倒萨倒萨倒
 ..........................

 我现在想写一个程序,需要将表中的每一行导出至一个txt文件,同时该文件需要按照 字段A的内容.txt这样的命名规则命名。即第一个TXT文件名称为:avsdd.txt,其中内容为字段B的内容。

 请问该如何实现?

 一行数据导出为一个文本有意思吗?!
请问如果数据表中有200万行数据,是不是要生成200万个文件呢?会吓死人的!

多谢,这是历史数据,大概1万多条吧。这次导出后,就不再导出了。

#9


引用 8 楼 yuanxi88 的回复:
引用 7 楼 soft_wsx 的回复:
引用 4 楼 soft_wsx 的回复:
引用楼主 yuanxi88 的回复:
现在有这样一个需求:
SQL2000数据表中有N行数据,如下所示:

序号  字段A  字段B(Text型)
1    avsdd  大声道撒的萨达倒萨倒萨
2    ueaed  大声道撒倒萨倒萨倒萨倒
..........................

我现在想写一个程序,需要将表中的每一行导出至一个txt文件,同时该文件需要按照 字段A的内容.txt这样的命名规则命名。即第一个TXT文件名称为:avsdd.txt,其中内容为字段B的内容。

请问该如何实现?

一行数据导出为一个文本有意思吗?!
请问如果数据表中有200万行数据,是不是要生成200万个文件呢?会吓死人的!

多谢,这是历史数据,大概1万多条吧。这次导出后,就不再导出了。
太可怕了!一万个文件!
字段A是惟一的吗?

#10


字段A不是唯一的。
每一个导出的文件大概在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


引用 13 楼 liangck 的回复:
-S.\SQLExpress 换成你的服务器名称..如果是默认实例,可以不用指定-S

我测试一下,多谢!

#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盘是具有写权限的。

#18


TO:chuifengde

这个执行成功,非常感谢。结贴。