有時候我們需要將SQL SERVER的數據一次性導入到ORACLE中,對於數據量大的表。我一般習慣先從SQL SERVER導出特殊格式的平面文件(CSV或TXT),然后用SQL*Loader裝載數據到ORACLE數據庫。 有時候由於一些特殊數據,我們需要導出一些特殊格式的文件,例如:
1:導出的平面文件,字段分隔符不要用逗號, 而使用其它分隔符,例如 | 或 &等
2:我們需要一些我們需要導出的CSV格式的文件,每個字段都用雙引號“”括起來
1:導出的平面文件,字段分隔符不要用逗號, 而使用其它分隔符,例如 | 或 &等
我們先看問題1吧,例如,我們需要導出sys.objects下所有對象,在查詢結果中選中所有對象,然后單擊右鍵,選擇”Save Results As"時有可以保持為CSV、TXT或其它文件格式, 此時默認的分隔符都為逗號,如果我想用|或&等特殊字符來分隔字段,怎么處理呢?
方法1:
在SSMS的“工具”->"選項“->"查詢結果"(Query Results)->"SQL SERVER"->"Results to Text" 下選項Custom delimiter選項,我們選擇|作為分隔符(遺憾的是分隔符似乎只能用一個字符,我想要@#$這樣的分隔符無法實現)
然后在菜單欄上點擊“Results to File”, 點擊執行語句就會將結果保存到文本文件或CSV文件中,此時你去查看導出結果,就會發現分隔符為“|”了。 注意,如果你使用“Save Results As" 導出文本文件或CSV格式文件,你會發現永遠都是逗號為分隔符。
這種方式還有一個最遺憾的就是不能將字段值用雙引號括起來。不像PL/SQL Developer這樣的工具可以實現這樣的功能
方法2:
借助bcp參數-t指定字符分割符,默認是"\t"。
bcp "SELECT * FROM sys.tables;" QUERYOUT "E:\test.csv" -c -t "|" -q -T -S localhost
方法3:
使用SQL將各個字段拼接起來。
方法4:
C#程序實現,當然是相當麻煩,如果願意痛苦一次,方便以后,這種方法也是可行的。
2:我們需要導出的CSV格式的文件,每個字段都用雙引號“”括起來
這個是否無法借助SSMS客戶端工具的配置來完成,我倒是有幾個方法間接來實現,不過都有些麻煩
1: SQL語句拼接,然后選擇所有結果,導出為csv格式。
SELECT '"' + COLUMNS1 + '"' ,
'"' + COLUMNS2 + '"' ,
'"' + COLUMNS3 + '"' ,
'"' + COLUMNS4 + '"' ,
'"' + COLUMNS5 + '"' ,
'"' + COLUMNS6 + '"' ,
'"' + COLUMNS7 + '"' ,
'"' + COLUMNS8 + '"' ,
'"' + COLUMNS9 + '"'
FROM dbo.TABLE_NAME;
2:借助bcp工具的參數-t指定字符分割符,默認是"\t"。
bcp "SELECT * FROM sys.tables;" QUERYOUT "E:\test.csv" -c -t "\",\"" -q -T -S localhost
這種方法導出的文件,第一個字段和最后一個字段都沒有的雙引號都不全,如果你熟悉UltraEdit,那么你可以很快的用列模式和替換方式補全。另外就是在SQL語句里面分別給第一個字段前面后最后一個字段后面添加雙引號解決問題。
3:C#代碼實現。