如何创建数据库行的文本文件?

时间:2012-06-02 12:03:36

标签: sql-server database sql-function

我有一个数据库表,其中包含一个名为File Content的列,以及许多行。我需要的是为File Content列的每一行创建一个文本文件。

示例:

Sr.        File Name        File Content

1.         FN1              Hello
2.         FN2              Good Morning
3.         FN3              How are you?
4.         FN4              Where are you?

假设我有4行,那么应该创建4个文本文件(可能有我们想要的任何名称)

  1. File1.txt中应包含“hello”字样。
  2. File2.txt应该有文字“早安”。
  3. File3.txt应该有文字“你好吗?”在它。
  4. File4.txt应该有文字“你在哪里?”在其中

2 个答案:

答案 0 :(得分:2)

这可以使用SQL server的BCP OUT语法完成。

对于设置:只需确保您在服务器上具有xp_cmdshell exec权限。这可以从master.sys.configurations表中检查。还要更改与您的服务器或网络共享对应的文件位置路径。我检查了并且能够生成4个文件,因为表中有4条记录。

use master
go

declare @DSQL Nvarchar(max)
declare @counter int
declare @maxrows int
declare @filename Nvarchar(30)

select @counter=1, @maxrows = 0

create table t1 (
 sno int identity(1,1) not null,
 filename varchar(5),
 filecontent varchar(100)
)

insert into t1
select 'FN1', 'Hello'
UNION
select 'FN2', 'Good Morning'
UNION
select 'FN3', 'How are you?'
UNION
select 'FN14', 'Where are you?'

select @maxrows = count(*) from t1

--SELECT * FROM T1

while (@counter <= @maxrows)
begin
  select @filename = filename from t1
   where sno = @counter
select @DSQL = N'exec xp_cmdshell' + ' ''bcp "select filecontent from master.dbo.T1 where sno = ' + cast(@counter as nvarchar(10)) + '" queryout "d:\temp\' + @filename + '.txt" -T -c -S home-e93994b54f'''

print @dsql
exec sp_executesql @DSQL
   select @counter = @counter + 1
end

drop table t1

答案 1 :(得分:2)

虽然你说你说你需要在TSQL中这样做,但如果可能的话,我不会这样做。 Ram已经向您展示了一个解决方案,但它的缺点是您需要使用xp_cmdshell并且SQL Server服务帐户需要权限才能访问您希望拥有文件的任何位置的文件系统。

我的建议是用您首选的语言编写脚本或小程序(PowerShell,Perl,Python,C#,等等),然后使用它。 TSQL作为一种语言非常适合处理文件或处理数据库之外的任何内容。显然这是可能的(CLR程序是另一种方式),但是你经常遇到权限,编码和其他问题,这些问题在外部语言中更容易处理。