2013-07-19 76 views
1

我需要从单个查询中创建多个xml文件(每行)。我的查询正在生成10,000 xml文件,因为您知道SQL Server为每个xml文件分配不同的名称,现在我需要将它们自动保存在c:\中。我可以看到所有的文件,但我无法保存任何建议或帮助将高度赞赏。还有一点提示:从SQL Server中,我们可以从SQL Server File选项卡中逐一保存每个xml。如何使用SQL Server数据库保存多个xml文件

CREATE TABLE dbo.sample(
    [BTno] [nvarchar](25) NULL, 
    [First_Name] [nvarchar](35) NULL, 
    [Last_Name] [nvarchar](35) NULL, 
    [BTid] [nvarchar](15) NULL, 
) ON [PRIMARY]; 

insert into dbo.sample values('1B','Vartan','Sarkis','69876'); 
insert into dbo.sample values('2B','Anoush','Eric','87656'); 
insert into dbo.sample values('3B','Lucine','Arpiar','65467'); 
insert into dbo.sample values('4B','Anum','Noor','98076'); 
insert into dbo.sample values('5B','Abercio','Banninq','34897'); 
insert into dbo.sample values('1C','Gaea','Nishan','29841'); 
insert into dbo.sample values('7B','Marilyn','Vahe','78903'); 
insert into dbo.sample values('2Z','Bansi','Aakarshan','34905'); 
insert into dbo.sample values('9S','Eric','Abban','45892'); 
insert into dbo.sample values('12B','Dave','Tate','19994'); 

- 这里是产生多个XML文件

select ((select * from dbo.sample a where a.BTid = b.BTid 
     for xml path('Row'),TYPE, ROOT('BT') 
     )) from dbo.sample b 

回答

0

我欺骗和使用别人的函数实际写入。请注意,您需要启用“Ole Automation Procedures”才能使写入过程正常工作。一些公司的安全策略对这些被启用的事情有点敏感。基本上我假设如果没有启用,你有能力这样做。写入功能也将覆盖具有相同文件名的文件,尽管这可能与您的需要无关。

declare @thexml xml 
declare @xmlstring varchar(max) 
declare @path varchar(255) 
declare @filename_start varchar(100) 
declare @filename varchar(100) 
declare @count int 

set @path='C:\testdata\' 
set @filename_start = 'xmlname' 
set @count = 0 

declare xcursor cursor for 
select ((select * from dbo.sample a where a.BTid = b.BTid 
     for xml path('Row'),TYPE, ROOT('BT') 
     )) from dbo.sample b 

open xcursor 

fetch xcursor into @thexml 

while @@fetch_status <> -1 begin 
    set @count = @count + 1 
    set @filename = @filename_start + cast(@count as varchar) + '.xml' 
    set @xmlstring = cast(@thexml as varchar(max)) 
    exec master.dbo.spWriteStringToFile @xmlstring,@path,@filename 

    fetch xcursor into @thexml 
end 

deallocate xcursor 

启用OLE - http://msdn.microsoft.com/en-us/library/ms191188.aspx

信用写程序 - https://www.simple-talk.com/sql/t-sql-programming/reading-and-writing-files-in-sql-server-using-t-sql/

实际写程序(必须从ALTER更改创建) - https://www.simple-talk.com/code/WorkingWithFiles/spWriteStringTofile.txt

+0

BIG谢谢。有效!非常感谢你。 –

0

这个脚本尝试查询,也许将是有益的:

CREATE PROCEDURE saveFile (@file varchar(1000), @txt VARCHAR(8000)) AS 
BEGIN 
    DECLARE @sys_obj INT 
    DECLARE @rst INT 
    DECLARE @fID INT 

    EXECUTE @rst = sp_OACreate 'Scripting.FileSystemObject', @sys_obj OUT 
    EXECUTE sp_OAMethod @sys_obj, 'FileExists', @rst OUT, @file 
    IF @rst=0 
     BEGIN  
      EXECUTE sp_OAMethod @sys_obj, 'OpenTextFile', @fID OUT, @file, 8, 1 
      EXECUTE sp_OAMethod @fID, 'WriteLine', Null, @txt 
      EXECUTE sp_OADestroy @fID 
      EXECUTE sp_OADestroy @sys_obj 
     END 
END 

而且这条线,可以节省磁盘字符串(例如XML):

EXEC saveFile @file = 'C:\test.xml', @txt = '<xml><test>123</test></xml>' 

用于保存所有的字段返回查询这里其他查询:

DECLARE cur CURSOR LOCAL FAST_FORWARD FOR 
      select CAST(((select * from dbo.sample a where a.BTid = b.BTid 
      for xml path('Row'),TYPE, ROOT('BT') 
      )) AS VARCHAR(MAX)) AS TXT from dbo.sample b 
    --HERE GO YOUR QUERY 
    /*Example 
      SELECT '<xml><test>111</test></xml>' AS TXT 
    UNION 
    SELECT '<xml><test>222</test></xml>' AS TXT 
    UNION 
    SELECT '<xml><test>333</test></xml>' AS TXT 
    */ 
DECLARE @v_count AS INTEGER 
DECLARE @v_txt AS VARCHAR(8000) 
DECLARE @v_filename AS VARCHAR(100) 

SET @v_count = 1 
SET @v_txt = '' 

OPEN cur FETCH NEXT FROM cur INTO @v_txt 

WHILE @@FETCH_STATUS = 0 
    BEGIN 
     SET @v_filename = 'C:\test' + CAST(@v_count AS VARCHAR) + '.xml' 
     EXEC saveFile @file = @v_filename, @txt = @v_txt 
     SET @v_count = @v_count + 1 
     FETCH NEXT FROM cur INTO @v_txt 
    END 
CLOSE cur 
DEALLOCATE cur 
+0

嗨加斯顿,该存储过程是确定的,但它将如何自动保存10,000个xml文件? –

+0

@AliAlisha:你自动说什么?如果您有SQL查询,则必须在**这里继续进行查询**。 –

+0

@AliAlisha现在检查,我把''DECLARE cur CURSOR LOCAL FAST_FORWARD FOR'后的查询。 –

相关问题