天天看點

SQL SERVER導出特殊格式的平面檔案

原文: SQL SERVER導出特殊格式的平面檔案

   有時候我們需要将SQL SERVER的資料一次性導入到ORACLE中,對于資料量大的表。我一般習慣先從SQL SERVER導出特殊格式的平面檔案(CSV或TXT),然後用SQL*Loader裝載資料到ORACLE資料庫。 有時候由于一些特殊資料,我們需要導出一些特殊格式的檔案,例如:

    1:導出的平面檔案,字段分隔符不要用逗号, 而使用其它分隔符,例如 | 或 &等

    2:我們需要一些我們需要導出的CSV格式的檔案,每個字段都用雙引号“”括起來

1:導出的平面檔案,字段分隔符不要用逗号, 而使用其它分隔符,例如 | 或 &等

我們先看問題1吧,例如,我們需要導出sys.objects下所有對象,在查詢結果中選中所有對象,然後單擊右鍵,選擇”Save Results As"時有可以保持為CSV、TXT或其它檔案格式, 此時預設的分隔符都為逗号,如果我想用|或&等特殊字元來分隔字段,怎麼處理呢?

http://images2015.cnblogs.com/blog/73542/201603/73542-20160323232148292-1555450736.png

方法1:

在SSMS的“工具”->"選項“->"查詢結果"(Query Results)->"SQL SERVER"->"Results to Text" 下選項Custom delimiter選項,我們選擇|作為分隔符(遺憾的是分隔符似乎隻能用一個字元,我想要@#$這樣的分隔符無法實作)

http://images2015.cnblogs.com/blog/73542/201603/73542-20160323232150354-295120684.png 然後在菜單欄上點選“Results to File”, 點選執行語句就會将結果儲存到文本檔案或CSV檔案中,此時你去檢視導出結果,就會發現分隔符為“|”了。  注意,如果你使用“Save Results As" 導出文本檔案或CSV格式檔案,你會發現永遠都是逗号為分隔符。 http://images2015.cnblogs.com/blog/73542/201603/73542-20160323232151995-1978300600.png

這種方式還有一個最遺憾的就是不能将字段值用雙引号括起來。不像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#代碼實作。