Sql-Server

為什麼 BCP 會創建這麼大的文件?

  • October 7, 2020

我正在通過 BCP 創建一些報告以通過電子郵件發送。

create TABLE ##tempsss
   (
       create TABLE ##JOB_DataAssociacao_verContrato
(
    F1        VARCHAR(6)  
   ,F2        VARCHAR(200)  
   ,F3        VARCHAR(22)  
   ,F4        char(1)    
   ,F5         varchar(10) 
   ,F6         varchar(15)
   ,F7         varchar(30)  
   ,F8          varchar(10)      
   ,F9          VARCHAR(18)  
)  --it needs to be varchar to be able to use header
   )
   
insert into  ##tempsss
SELECT 
...fields...     
FROM some table or view
go
-------------------------------------------------------------
--passo 2 --

exec xp_cmdshell 'bcp "select ''field1'',''field2'',''field3'' UNION ALL select * from table or view" queryout "filepath\filename.xls" -U sa -P password -w  -S servername'
-------------------------------------------------------------

EXEC msdb.dbo.sp_send_dbmail
   @profile_name = 'dba profile or something',
   @recipients = 'recipients email',
   @subject = 'email subject',
   @file_attachments='path\filename.xls'
-------------------------------------------------------------

drop table ##tempsss

有 9k 行,我有一個 2mb 的文件。我只是複制這個文件的內容,然後粘貼到一個空的 excel 文件中,我有 160KB。

如何使用 bcp 但創建較小的文件?

我在通過 dbmail 發送超過 1mb 的文件時遇到了問題。

我將 dbmail 設置為發送 10mb+ 的文件。smtp 也可以。

Excel 在保存文件時在內部使用壓縮,這可能是您看到更小的 Excel 文件的最可能原因。

我建議在通過電子郵件發送之前壓縮 .bcp 文件。使用命令行壓縮器,例如 7-Zip。

此外,我建議通過 -N 選項使用 BCPs Native (-n) 或 Unicode Native 格式。-c如果導出中有 Unicode (nvarchar/nchar) 數據類型,請小心使用模式。

本機格式維護數據庫的本機數據類型。本機格式旨在用於 SQL Server 表之間的高速數據傳輸。如果使用格式文件,源表和目標表不需要相同。數據傳輸包括兩個步驟:

  • 將源表中的數據批量導出到數據文件中
  • 將數據文件中的數據批量導入目標表。

在相同表之間使用本機格式避免了數據類型與字元格式的不必要轉換,從而節省時間和空間。然而,為了達到最佳傳輸速率,很少對數據格式進行檢查。為防止載入數據出現問題,請參閱以下限制列表。

來自bcp.exe 命令行實用程序的聯機叢書:

-n

使用數據的本機(數據庫)數據類型執行大容量複製操作。此選項不提示每個欄位;它使用本機值。

有關詳細資訊,請參閱使用本機格式導入或導出數據 (SQL Server)

-N

對非字元數據使用數據的本機(數據庫)數據類型,對字元數據使用 Unicode 字元執行大容量複製操作。此選項提供比 -w 選項更高性能的替代方案,旨在使用數據文件將數據從 SQL Server 的一個實例傳輸到另一個實例。它不會提示每個欄位。當您傳輸包含 ANSI 擴展字元的數據並希望利用本機模式的性能時,請使用此選項。

有關詳細資訊,請參閱使用 Unicode 本機格式導入或導出數據 (SQL Server)

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