Sql-Server-2008

SQL Server - 將表導出到 XML 文件

  • January 3, 2017

我需要將 sql server 2008 R2 數據庫的所有表 (500) 導出到 XML。最好和最快的方法是什麼?

可以使用 BCP 實用程序來完成這項工作。

先決條件:

  1. 您需要配置您的伺服器,以啟用xp_cmdshell
EXEC master.dbo.sp_configure 'show advanced options', 1
RECONFIGURE
EXEC master.dbo.sp_configure 'xp_cmdshell', 1
RECONFIGURE
  1. 權限,哪個帳戶xp_cmdshell正在執行?
xp_cmdshell 'whoami' 
  1. 創建一個新文件夾,您將在其中保存文件,並將對該文件夾的完全訪問權限授予步驟 2 的使用者。

我建議您首先嘗試使用幾個表,TOP為游標選擇添加一個條件,以驗證此腳本在您的伺服器中執行良好。

select TOP 3 TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME
from INFORMATION_SCHEMA.Tables 
where TABLE_TYPE = 'BASE TABLE';

基本上,腳本從 中獲取表列表INFORMATION_SCHEMA,並為列表中的每個元素執行 BCP 實用程序。

XML 文件將被命名為:DATABASE_SCHEMA_TABLE.XML

這是完整的腳本,在執行它之前,<...>根據您的系統配置替換包含的值:

use <your_database>
go

declare @ServerInstance nvarchar(50),
       @Database sysname, 
       @Schema sysname,
       @Table sysname, 
       @RootFolder nvarchar(165),
       @BcpParams nvarchar(100),
       @cmdBCP nvarchar(500),
       @FQI varchar(600),
       @FileName varchar(600),
       @retExec int;

   set @ServerInstance = '<server\instance>';
   set @BcpParams = '-t -T -w';
   set @RootFolder = '<folder_name>';


   declare curXml cursor fast_forward for
       select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME
       from INFORMATION_SCHEMA.Tables 
       where TABLE_TYPE = 'BASE TABLE';

   open curXml;
   fetch next from curXml into @Database, @Schema, @Table

   while @@FETCH_STATUS = 0
   begin

       set @FQI = @Database + '.' + @Schema + '.' + @Table;
       set @FileName = @RootFolder + @Database + '_' + @Schema + '_' + @Table + '.xml';

       select @cmdBCP = ' bcp "SELECT * FROM '
                        + @FQI 
                        + ' row FOR XML AUTO, ROOT(''' + @Table + '''), elements"'
                        + ' queryout "' + @FileName + '" '
                        + @BcpParams
                        + ' -S ' + @ServerInstance;

       print @cmdBCP;

       EXEC @retExec = xp_cmdshell @cmdBCP;

       if @retExec <> 0
       begin
           close curXml;
           deallocate curXml;
           raiserror('BCP Error', 16, 1);
       end

       fetch next from curXml into @Database, @Schema, @Table;
   end

   close curXml;
   deallocate curXml;

引用自:https://dba.stackexchange.com/questions/159551