将XML数据导出到多个文件但保留结构

时间:2015-09-02 13:28:24

标签: sql-server tsql ssis ssis-2012

过去几天我一直在网上搜索,遗憾的是找不到我想要的东西。我有一个包含2列的SQL Server 2012表,一个是PurchaseOrder DataType varchar(10),另一个是DataType为XML的Data。目前正在运行存储过程的几小时内,检查一些表的值,然后创建所需XML格式的PurchaseOrder。这已经由我将要发送数据的公司实现并验证。我现在的问题是我想创建一个SSIS包来查看这个表并创建多个xml文件,其中包含数据字段的内容"不将内容放入一个长行"然后使用PurchaseOrder字段作为文件名。我找到了各种零件解决方案,例使用脚本任务,因为SSIS中没有原生XML目标,但是对于SSIS而言并不惹人注目,并且没有快速到达任何地方。任何人都可以提供任何帮助,指导,youtube链接,甚至是包装的一部分。

谢谢P

除了上面的问题,我试图用bcp命令来解决它,下面是下面的代码,只看前1条记录

DECLARE @fileName VARCHAR(50)

DECLARE @sqlStr VARCHAR(1000)
DECLARE @sqlCmd VARCHAR(1000)

SET @fileName = 'C:\Temp\test.xml'
SET @sqlStr = 'select TOP 1 Data from DatabaseName.dbo.OutputXML'

SET @sqlCmd = 'bcp "' + @sqlStr + '" queryout ' + @fileName + '
-w -T -S Server\Instance'

EXEC xp_cmdshell @sqlCmd

我所做的是将其添加到游标中,该游标再次起作用,它创建我的文件,使用purchaseorder作为文件名并输出相关信息但不再保持正确的xml格式,它回到看起来像一个没有原始格式的字符串,这是因为我嵌入它在光标?以下是我正在使用的代码

DECLARE @fileName VARCHAR(50) 
DECLARE @sqlStr VARCHAR(1000)
DECLARE @sqlCmd VARCHAR(1000)

DECLARE xml_cursor CURSOR FOR

SELECT PurchaseOrder from DatabaseName.dbo.OutputXML

OPEN xml_cursor

FETCH NEXT FROM xml_cursor INTO @fileName

WHILE @@FETCH_STATUS = 0 
BEGIN

SET @fileName = 'C:\Temp\'+@fileName+'.xml'
SET @sqlStr = 'select Data from DatabaseName.dbo.OutputXML'

SET @sqlCmd = 'bcp "' + @sqlStr + '" queryout ' + @fileName + ' 
-w -T -S Server\Instance'

EXEC xp_cmdshell @sqlCmd

FETCH NEXT FROM xml_cursor into @fileName

END
CLOSE xml_cursor
DEALLOCATE xml_cursor

1 个答案:

答案 0 :(得分:2)

由于bcp是命令行实用程序,因此它不知道您的光标。您只能更改传递的参数。您已从光标传递@filename,您还需要过滤查询。下面是如何解决您的问题,但它远非一个伟大的解决方案,它将是非常缓慢的。我不知道你的密钥叫什么,所以我称之为SomeKey

DECLARE @fileName VARCHAR(50) 
DECLARE @sqlStr VARCHAR(1000)
DECLARE @sqlCmd VARCHAR(1000)
DECLARE @SomeKey VARCHAR(100) --Put your key datatype here 

DECLARE xml_cursor CURSOR FOR

-- replace SomeKey with your key
SELECT SomeKey,PurchaseOrder FROM DatabaseName.dbo.OutputXML

OPEN xml_cursor

FETCH NEXT FROM xml_cursor INTO @SomeKey,@fileName

WHILE @@FETCH_STATUS = 0 
BEGIN

SET @fileName = 'C:\Temp\' + @filename + '.xml'
SET @sqlStr = 'SELECT Data FROM DatabaseName.dbo.OutputXML WHERE SomeKey = ''' + @SomeKey +''''

SET @sqlCmd = 'bcp "' + @sqlStr + '" queryout ' + @fileName + '-w -T -S Server\Instance'

EXEC xp_cmdshell @sqlCmd

FETCH NEXT FROM xml_cursor into @SomeKey,@fileName

END
CLOSE xml_cursor
DEALLOCATE xml_cursor