我需要从单个查询中创建多个xml文件(每行)。我的查询生成10,000 xml文件,因为您知道SQL Server为每个xml文件分配不同的名称,现在我需要将它们自动保存在c:\中。我可以看到所有的文件,但我无法保存任何建议或帮助将非常感激。还有一个提示:从SQL服务器我们可以从SQL服务器文件选项卡中逐个保存每个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 :(得分: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
使用这一行,可以将一个String(例如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
答案 1 :(得分:0)
我欺骗并使用别人的功能进行实际写作。请注意,您需要启用“Ole Automation Procedures”才能使写入过程正常工作。一些公司的安全策略对于启用这些内容有点敏感。基本上我假设如果没有启用,你就有能力这样做。 write函数也会覆盖具有相同文件名的文件,但这可能与您的需求无关。
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/code/WorkingWithFiles/spWriteStringTofile.txt