我有一个数据库表,其中包含一个名为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个文本文件(可能有我们想要的任何名称)
File1.txt
中应包含“hello”字样。File2.txt
应该有文字“早安”。File3.txt
应该有文字“你好吗?”在它。File4.txt
应该有文字“你在哪里?”在其中答案 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程序是另一种方式),但是你经常遇到权限,编码和其他问题,这些问题在外部语言中更容易处理。