使用 OPENROWSET(BULK...) 批量導入文字檔到 SQL Server 時,若資料欄位被雙引號 " 包裹,需在插入前移除。在動態 SQL 字串中呼叫 REPLACE(col, '"', '') 會因單引號巢狀導致語法錯誤,關鍵在於正確轉義單引號。
-- 錯誤:單引號衝突
SELECT REPLACE(aa, '"', ''), ...
在 SQL Server 字串常值中,單引號以「兩個單引號」表示。因此 '"'" 代表字串 '"(單引號包裹雙引號),'''' 代表字串 ''(空字串)。完整 REPLACE 參數寫法:
REPLACE(aa, '""', '') -- 移除雙引號
-- 完整動態 SQL 片段
exec ('INSERT INTO xxdd (aa,bb,cc,dd,ee,ff)
SELECT REPLACE(aa,''"'',''''), REPLACE(bb,''"'',''''), ...
FROM OPENROWSET(BULK ''' + @filepath + ''', FORMATFILE=''' + @fmtfilepath + ''', FIRSTROW=2, MAXERRORS=10, ROWS_PER_BATCH=10000) AS t')
'"" → 字串常值 ""(雙引號)'''' → 字串常值 ''(空字串,即替換後的目標)若可控制來源檔案格式,建議在 .fmt 格式化檔中直接設定欄位終止符與引號字元,讓 OPENROWSET 自動解析去除引號,避免動態 SQL 複雜轉義,效能也更好。
掌握單引號雙寫轉義規則,即可在動態 SQL 中靈活使用 REPLACE 等字串函式處理髒資料。