日常運維中,經常面臨「只導出最近 30 天訂單」「導出特定狀態的用戶」「排除測試數據」等需求。若每次都導出全表再手工篩選,既浪費磁盤 I/O 又增加後續處理成本。SQL Server 導入/導出嚮導內建的「編寫查詢指定要傳輸的數據」功能,能在源端直接完成過濾,實現按需導出。

SELECT OrderID, CustomerID, OrderDate, TotalAmount
FROM dbo.Orders WITH (INDEX(IX_Orders_OrderDate)) -- 強制使用索引
WHERE OrderDate >= DATEADD(DAY, -30, CAST(GETDATE() AS DATE))
AND OrderDate < CAST(GETDATE() AS DATE)
AND Status NOT IN ('Cancelled', 'Test');
DECLARE @PageSize INT = 100000, @PageNum INT = 1;
WHILE 1=1
BEGIN
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY Id) AS rn
FROM dbo.HugeTable
WHERE CreateTime >= '2023-01-01'
) t WHERE rn BETWEEN (@PageNum-1)*@PageSize+1 AND @PageNum*@PageSize;
IF @@ROWCOUNT = 0 BREAK;
SET @PageNum += 1;
-- 在嚮導中可對應多個目標文件:data_part1.csv, data_part2.csv...
END
SELECT
UserID, UserName, Email,
CASE WHEN Role='Admin' THEN '***MASKED***' ELSE Phone END AS Phone,
CreatedAt
FROM dbo.Users
WHERE IsActive = 1;
| 技巧 | 說明 |
|---|---|
使用 NOLOCK / READUNCOMMITTED | 導出歷史歸檔數據時可加 WITH (NOLOCK) 減少阻塞,但可能讀到臟數據,視業務容忍度決定。 |
| 目標為 Excel 時的類型映射 | 嚮導對 MAX/VARCHAR(MAX) 映射到 Excel 可能截斷(255/32767 字符),建議在查詢中 CAST(col AS VARCHAR(4000)) 或改用 CSV 目標。 |
| 保留 Identity 值 | 目標為 SQL Server 時,勾選「Enable identity insert」以保留原主鍵值。 |
| 處理 NULL 顯示 | 查詢中用 ISNULL(col, 'N/A') 或 COALESCE 統一 NULL 文本表示,便於下游處理。 |
| 大字段導出截斷 | 文本/圖片字段導出到平面文件時,嚮導默認限制 4000 字符,需在「Advanced」頁調整 OutputColumnWidth。 |
生產環境建議使用 BCP、PowerShell + SqlClient 或 SSIS 封裝 實現定時、無人值守導出:
-- BCP 範例(導出到 CSV)
bcp "SELECT * FROM SalesDB.dbo.Orders WHERE OrderDate >= '2024-01-01'" queryout "D:\Export\Orders_202401.csv" -c -t, -T -S localhost -d SalesDB
掌握「查詢導出」模式,能將數據導出從「全量搬運」升級為「精準交付」,顯著提升運維效率與數據治理能力。