将 XML 数据导出到多个文件但保留结构
Exporting XML Data to mutiple files but retain structure
过去几天我一直在网上搜索,很遗憾找不到我要找的东西。我有一个包含 2 列的 SQL Server 2012 table,一列是 PurchaseOrder DataType varchar(10),另一列是数据类型为 XML 的数据。目前存储过程每隔几个小时发生的事情是 运行 检查多个 table 的值,然后以所需的 XML 格式创建 PurchaseOrder。我将向其发送数据的公司已经实现并验证了这一点。我现在遇到的问题是我想创建一个 SSIS 包来查看此 table 并使用数据字段 "not putting the contents in to one long line" 的内容创建多个 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
然后我所做的是将它添加到游标中,它再次起作用,它创建我的文件,使用采购订单作为文件名并输出相关信息,但它不再包含正确的 xml 格式,它看起来像一个带有原始格式 none 的字符串,这是因为我将它嵌入到光标中了吗?下面是我正在使用的代码
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
由于 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
过去几天我一直在网上搜索,很遗憾找不到我要找的东西。我有一个包含 2 列的 SQL Server 2012 table,一列是 PurchaseOrder DataType varchar(10),另一列是数据类型为 XML 的数据。目前存储过程每隔几个小时发生的事情是 运行 检查多个 table 的值,然后以所需的 XML 格式创建 PurchaseOrder。我将向其发送数据的公司已经实现并验证了这一点。我现在遇到的问题是我想创建一个 SSIS 包来查看此 table 并使用数据字段 "not putting the contents in to one long line" 的内容创建多个 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
然后我所做的是将它添加到游标中,它再次起作用,它创建我的文件,使用采购订单作为文件名并输出相关信息,但它不再包含正确的 xml 格式,它看起来像一个带有原始格式 none 的字符串,这是因为我将它嵌入到光标中了吗?下面是我正在使用的代码
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
由于 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