SQL Server 資料搬遷、異構資料源整合、備份還原,核心都離不開匯入匯出操作。本文彙整 bcp、OPENROWSET、OPENDataSource、BULK INSERT、sp_xml_preparedocument 等核心技術,涵蓋 Excel、CSV、TXT、DBF、Access、XML、整庫等 10+ 場景,附完整 T-SQL 範例碼,可直接複製調適生產環境使用。
| 工具/語法 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
bcp / xp_cmdshell | 大量資料、文字檔、整庫、自動化排程 | 效能最強、支援格式多、可離線操作 | 需啟用 xp_cmdshell、權限管理較複雜 |
OPENROWSET / OPENDataSource | Ad-hoc 查詢、Excel/Access/DBF 直接查詢 | 純 T-SQL、無需外部程式、可 JOIN 查詢 | 需啟用 Ad Hoc Distributed Queries、64位元驅動程式配置麻煩 |
BULK INSERT | 文字檔/CSV 導入資料表 | 語法簡潔、效能佳、可指定分隔符 | 僅支援導入、檔案需在資料庫伺服器可存取路徑 |
| XML 節點剖析 | XML 檔案導入關聯表 | 結構化強、支援複雜巢狀結構 | 需撰寫 XQuery/XPath、大檔案記憶體壓力大 |
EXEC master..xp_cmdshell
'bcp "SettleDB.dbo.shanghu" out "c:\temp1.xls" -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""'
關鍵參數:-c 字元模式、-q 引用識別碼、-S 伺服器、-U/-P 認證。
SELECT *
FROM OpenDataSource('Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
註:.xlsx 需改用 Microsoft.ACE.OLEDB.12.0 + Extended Properties='Excel 12.0 Xml;HDR=YES'。
EXEC master..xp_cmdshell
'bcp "Select * from dbname..tablename" queryout "d:\tt.txt" -c -t"," -U sa -P password'
-t"," 指定逗點為欄位分隔符。
BULK INSERT dbname..tablename
FROM 'c:\test.txt'
WITH (
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n',
FIRSTROW = 2 -- 跳過標題列
)
導入:
SELECT * FROM OPENROWSET('MSDASQL',
'Driver=Microsoft Visual FoxPro Driver;SourceDB=e:\VFP98\data;SourceType=DBF',
'SELECT * FROM customer WHERE country != "USA" ORDER BY country')
導出至現存 DBF 結構:
INSERT INTO OPENROWSET('MSDASQL',
'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',
'SELECT * FROM [aa.DBF]')
SELECT * FROM SQL_Source_Table
導出: INSERT INTO OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'x:\A.mdb';'admin';'', A表) SELECT * FROM SQL_DB..B表
導入: INSERT INTO B表 SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'x:\A.mdb';'admin';'', A表)
DECLARE @idoc INT, @doc NVARCHAR(MAX)
SET @doc = N' '
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
SELECT * FROM OPENXML(@idoc, '/root/Customer/Order', 1)
WITH (oid CHAR(5), amount FLOAT, comment NTEXT 'text()')
EXEC sp_xml_removedocument @idoc
CREATE PROCEDURE File2Table
@servername VARCHAR(200), @username VARCHAR(200), @password VARCHAR(200),
@tbname VARCHAR(500), -- 含 'db.dbo.table' 則單表;僅 'db' 則整庫
@filename VARCHAR(1000), -- 整庫時為資料夾路徑
@isout BIT -- 1=匯出, 0=匯入
AS
BEGIN
IF @tbname LIKE '%.%.%'
BEGIN
DECLARE @sql VARCHAR(8000) = 'bcp ' + @tbname +
CASE @isout WHEN 1 THEN ' out ' ELSE ' in ' END +
'"' + @filename + '" /w /S ' + @servername +
CASE WHEN ISNULL(@username,'')='' THEN '' ELSE ' /U ' + @username END +
' /P ' + ISNULL(@password,'')
EXEC master..xp_cmdshell @sql
END
ELSE
BEGIN
-- 整庫邏輯:游標遍歷 sysobjects 產生每表 bcp 命令
-- 此處省略完整游標代碼,實際部署請補全
END
END
調用範例:EXEC File2Table 'localhost','sa','pwd','MyDB..MyTable','C:\backup\MyTable.txt',1(匯出單表)
sp_configure 'show advanced options',1; RECONFIGURE; sp_configure 'xp_cmdshell',1; RECONFIGURE;(啟用 xp_cmdshell)sp_configure 'Ad Hoc Distributed Queries',1; RECONFIGURE;(啟用 OPENROWSET)ALTER DATABASE [DB] SET RECOVERY SIMPLE 減少記錄檔膨脹UPDATE STATISTICS 重建統計資訊| 錯誤訊息 | 原因 | 解決方案 |
|---|---|---|
| 「無法啟動 OLE DB 提供者」 | 驅動程式未安裝/位元數不符 | 安裝對應版本 ACE/OLEDB 驅動,確認 SQL Server 位元數 |
| 「存取被拒絕」 | 服務帳戶無檔案權限 | 授予 SQL Server 服務帳戶資料夾讀寫權限 |
| 「資料截斷」 | 目標欄位長度不足 | 擴大目標欄位長度或預處理資料 |
| 「XML 剖析錯誤」 | XML 格式不符/編碼錯誤 | 驗證 XML Well-formed,指定正確編碼 |