使用XML文件在服务器之间移动SQL数据

时间:2015-10-14 11:09:58

标签: sql-server xml batch-file

我必须将数据从一个SQL数据库移动到另一个服务器上的精确副本。我知道这样做的替代方法可能更容易,但由于这不是我的决定,我这样做的唯一方法是将数据从表导出到XML文件中,然后再导入到另一台服务器上。 / p>

我目前正在使用最复杂的表开发和测试此解决方案,该表还包含一个非常大的XML字段。这将导出到文件,使用.bat文件中的以下命令。

ECHO OFF

sqlcmd -h-1 -y0 -k1 -S [server name] -d [database name] -E -Q "SET NOCOUNT ON SELECT TOP 3 * FROM t_section FOR XML PATH" -o TestSectionResult.xml

然而,当我查看导出文件时,它稍微重新格式化了,添加了额外的换行符,当我尝试复制并粘贴到导入功能时,它会使其无效。我可以做些什么来解决这个问题,并且从查询中得到XML 完全 ,因为它直接从SSMS复制时效果很好。

这引出了我的第二个问题,即当我以正确的格式粘贴XML时,我必须导入XML的存储过程非常有效,但我需要能够从文件中导入它,这应该是在.bat文件命令中提供。

我知道OPENROWSET似乎是从文件中读取的标准方式,但我需要从.bat文件中完成。在sqlcmd中插入此值的正确方法是什么?

现在我将此作为我的存储过程:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE usp_xml_to_section 

    @inputXML XML

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    --TRUNCATE TABLE t_section;

    --INSERT INTO t_section
    SELECT 
        xmlRows.value('Id[1]', 'int') AS Id, 
        xmlRows.value('work_item_id[1]', 'int') AS work_item_id,
        xmlRows.value('section_type_id[1]', 'int') AS section_type_id,
        xmlRows.value('section_state_id[1]', 'int') AS section_state_id,
        xmlRows.query('section_xml[1]/*') AS section_xml,
        xmlRows.value('created_date[1]', 'datetime') AS created_date,
        xmlRows.value('created_by[1]', 'uniqueidentifier') AS created_by,
        xmlRows.value('updated_date[1]', 'datetime') AS updated_date,
        xmlRows.value('updated_by[1]', 'uniqueidentifier') AS updated_by,
        xmlRows.value('active[1]', 'bit') AS active
    FROM @inputXML.nodes('/row') AS XTbl(xmlRows)

END
GO

我不知道如何将xml文件传递给它并获得预期的结果。如果有人可以提供任何帮助或链接以允许我这样做,那将非常感激。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我现在已经改变了策略,而是使用c#Windows控制台应用程序执行此操作,它更简单,更有效。