【问题标题】:Exporting all tables into files from SQL Server database using utility bulk copy使用实用程序批量复制将所有表从 SQL Server 数据库导出到文件中
【发布时间】:2013-11-24 21:51:44
【问题描述】:

我想将所有表从数据库中 bcp 到文件中:

SELECT 'EXEC xp_cmdshell ''bcp '           --bcp
+  QUOTENAME(DB_NAME())+ '.'               --database name
+  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+ '.'  -- schema
+  QUOTENAME(name)                         -- table
+ ' out c:\temp\'                          -- output directory
+  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'
+  REPLACE(name,' ','')                    -- file name
+ '.txt -T -c'''   -- extension, security
FROM sys.tables

它会产生这样的语句:

EXEC xp_cmdshell 'bcp [AdventureWorks2012].[Production].[ScrapReason] out c:\temp\Production_ScrapReason.txt -T -c'

EXEC xp_cmdshell 'bcp [AdventureWorks2012].[HumanResources].[Shift] out c:\temp\HumanResources_Shift.txt -T -c'

所以我想要的是迭代上面的语句并执行所有它们。如何做到这一点?

【问题讨论】:

    标签: sql-server tsql bcp


    【解决方案1】:

    默认设置是不能从 SQL 服务器执行 bcp 命令。此版本适用于 DOS、Powershell 和 BAT 文件。

    我没有从 BCP 中找到可以导出这些 CSV 文件标题行的设置,因此请注意这些 CSV 文件不包含标题。

    -- Run this command to the database you wish to export
    DECLARE @Commands TABLE(CommandText NVARCHAR(4000));
    DECLARE @SQL NVARCHAR(4000);
    
    INSERT INTO @Commands
    SELECT 'bcp '           --bcp
    +  QUOTENAME(DB_NAME())+ '.'               --database name
    +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+ '.'  -- schema
    +  QUOTENAME(name)                         -- table
    + ' out c:\temp\csvdump\'                  -- output directory
    +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'
    +  REPLACE(name,' ','')                    -- file name
    + '.csv -T -C 65001 -t "|" -k -c -S localhost'   -- extension, security
    FROM sys.tables
    
    -- Copy-paste results to DOS or Powershell prompt or create a BAT file from these.
    SELECT 'mkdir c:\temp\csvdump'
    UNION ALL
    SELECT * FROM @Commands
    

    【讨论】:

      【解决方案2】:

      请注意,这假定所有命令都是唯一的。

      DECLARE @Commands TABLE(CommandText NVARCHAR(4000));
      DECLARE @SQL NVARCHAR(4000);
      
      INSERT INTO @Commands
      SELECT 'EXEC xp_cmdshell ''bcp '           --bcp
      +  QUOTENAME(DB_NAME())+ '.'               --database name
      +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+ '.'  -- schema
      +  QUOTENAME(name)                         -- table
      + ' out c:\temp\'                          -- output directory
      +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'
      +  REPLACE(name,' ','')                    -- file name
      + '.txt -T -c'''   -- extension, security
      FROM sys.tables
      
      WHILE (SELECT COUNT(*) FROM @Commands) > 0
      BEGIN --Command Processing
          SET @SQL = (SELECT TOP 1 CommandText FROM @Commands)
          --PRINT (@SQL)
          EXEC (@SQL)
          DELETE FROM @Commands WHERE CommandText = @SQL
      END
      

      【讨论】:

      • 我还没有尝试,因为我没有时间,但是备份 (c:\temp\...) 完成了它放在哪里?在我的本地机器上还是在远程机器上?
      • 在您运行脚本的服务器上。要在其他地方获得它,我们需要一条 unc 路径。
      • 注意Server blocked access to procedure 'sys.xp_cmdshell' 必须启用它才能运行上述sql。我通过更改 sql 以打印裸 bcp 命令并从中创建一个 .bat 文件来避免这种情况。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      相关资源
      最近更新 更多