2011-09-12 34 views
36

我花了2天的時間嘗試從SQL Server安裝中導出包含用戶輸入數據的大型文本字段的75,000行表。這些數據包含每一個簡單的ascii字符,製表符和換行符。我需要導出每個字段被引用的CSV,並且引用列中的引號已正確轉義(「」)。將數據從SQL Server Express導出爲CSV(需要引用和轉義)

以下是我到目前爲止所嘗試的: - 右鍵單擊​​Management Studio中的數據庫並導出到Excel:由於字段太長而失敗。 - 將數據從Management Studio導出到帶有文本分隔符和逗號分隔的平面文件 - 完全無用,在字段內不會引用引號,從而使文件完全模糊不清。 - 命令行的BCP - 也不支持引用字段

我需要使用FasterCSV ruby​​庫進行導入,它不允許引號分隔符是非標準的ASCII字符或多個字符,也不允許在未引用的列中使用\ n或\ r

任何幫助,非常感謝。

+1

可你剛剛從Ruby程序連接到SQL Server和跳過出口/導入步驟? YOu可以使用ruby-DBI包來連接select *,然後根據需要引用它。 – Doon

+0

@Doon可能值得關注。如果我可以通過Ruby連接並獲得結果,則可以使用FasterCSV導出有效的CSV。我無法從外部客戶端連接,因爲我在具有嚴格權限的計算機上工作,該權限不允許遠程連接到SQL服務器。 –

+0

如果您使用的是SQL Server 2012,則可能遇到此問題https://connect.microsoft.com/SQLServer/feedback/details/735714 – andrej351

回答

25

我一直在試圖弄清楚這一點。不知道這是否會爲你工作,因爲你的表比我大得多,但是這是我做只是出於一時興起:

  1. 我快做一個SELECT *聲明
  2. 拉起我的表簡單地選擇所得到的行和Ctrl鍵 + ç
  3. 打開的Excel
  4. 突出列的量的表我是粘貼有
  5. 粘貼,它受詛咒WOR糟透了!
  6. 現在只需將Excel導出爲CSV並完成。

我知道這聽起來很愚蠢,但它確實對我有用。

+5

這個答案確實應該是upvoted。我比OP更震驚,這實際上工作。由於生產服務器沒有安裝Excel或其他任何東西,因此我在遠程桌面上執行了一個170 K行的表格。 所以我進入了guest RDP系統,運行了SQL,複製了這些行,然後回到了運行RDP會話並粘貼到OpenOffice中的主機系統。 大約需要10分鐘才能通過RDP流式傳輸剪貼板數據,並且我不得不拖動OpenOffice稍後重新繪製剪貼板數據,但它確實工作併產生了轉義數據。 悲傷但真實。 –

+14

我想補充一點,我希望微軟的工程師每天都會被踢上臺面。 –

+3

這是一個恥辱,這是沒有標記爲答案,因爲這絕對有效。在我的情況下,從SSMS導出沒有正確地用字符串轉義字符串。在Excel中複製/粘貼,然後導出是答案,因爲它更好地處理CSV。 –

2

這裏有一個腳本我用的精髓完成這一點:

require 'rubygems' 
require 'active_record' 
require 'tiny_tds' 
require 'activerecord-sqlserver-adapter' 
require 'acts_as_reportable' 
require 'ruport' 

ActiveRecord::Base.logger = Logger.new("log/debug.log") 
ActiveRecord::Base.establish_connection(
    :adapter => 'sqlserver', 
    :mode  => 'dblib', 
    :dataserver => 'servername', 
    :username => 'username', 
    :password => 'password', 
    :timeout => '60000' 
) 

class Table1 < ActiveRecord::Base 
    set_table_name 'table_name' 
    set_primary_key 'table_id' 
    acts_as_reportable 
end 

Table1.report_table(:all).save_as("finished/table1.csv") 

希望它能幫助!

41

它可以完成!但是,您必須特別配置SSMS才能使用帶引號的輸出,因爲出於某種愚蠢的原因,它不是默認值。

在要保存查詢窗口去查詢 - >查詢選項...

勾選「包含列表分隔保存的.csv結果時,引用字符串」。

enabling quoted csv output

然後

select 'apple,banana,cookie' as col1,1324 as col2,'one two three' as col3,'a,b,"c",d' as col4 

將輸出

col1,col2,col3,col4 
"apple,banana,cookie",1324,one two three,"a,b,""c"",d" 

這是我們都希望。

+0

如果您的數據的字段帶有引號,但沒有逗號,http://stackoverflow.com/questions/14573623/whats-a-semantically-correct-way-to-parse-csv-from-sql-server-2008/14575076 has一個可以工作的Ruby方法(FasterCSV不會) –

+5

請注意,此解決方案適用於特定查詢。在保存.csv結果時,可以在工具>選項>查詢結果> SQL Server>結果到網格>引用包含列表分隔符的字符串中爲所有查詢設置默認值 –

+10

這不適用於包含換行符的文本字段。 – jrothenbuhler

1

我很好奇爲什麼沒有人建議在這個過程中使用SSIS(SQL Server Integration Services)?從SSMS(SQL Server Management Studio)中導入/導出的所有嚮導和工具絕對不是全面的(而且它們當然不是全部的,並且是的,微軟應該有很多東西需要回答這些限制)。但SSIS是一個非常全面的ETL工具,旨在解決問題,正如一樣。學習曲線可能會有些陡峭,但將表格導出到以逗號/引號分隔的csv文件並不特別困難。

爲了讓開發環境創建一個包,可能需要爲Visual Studio添加此附件:http://www.microsoft.com/en-us/download/details.aspx?id=42313 (鏈接適用於VS 2013,其他鏈接可用於其他版本的VS)。

+0

這是最好的解決方案但是當你想要一個快速和骯髒的一次性副本到Excel時,它只是感覺很費力。它不應該這麼難! – aucuparia

7

要做到這一點最簡單的方法:

使用Excel數據導入工具

  • 進入數據>自其他來源>從SQL Server
  • 填寫服務器名稱等
  • 選擇要導入的表或視圖。

然後將導入的數據保存到CSV文件。 如果要導出查詢,然後將查詢保存爲視圖

+0

這是解決原始問題的方法。它在本地爲我工作,但由於安全限制,我有一個數據庫,因此無法以這種方式與Excel連接。 :-( – Ads

+2

我有一堆數據用引號,換行符,奇怪的字符等等。這是有效的答案。謝謝。(但應該指出,我必須選擇我的列到一個新表中,以便Excel可以看到表,而不是結果集) –

+0

是的,創建一個視圖並導出它,而不是運行一些SQL並創建一個臨時報告。這是我認爲的最佳實踐。 – Dave

0

Robert Calhoun的解決方案對我無效。我們有很多帶逗號和回車/換行符的文字。 我們使用了導出功能,並對Chris Christodoulou的解決方案進行了一些更改。

在SQL Management Studio中,右鍵單擊數據庫並選擇任務 - >導出數據。

然後選擇SQL Server作爲源和平面文件作爲目標。命名文件MyFile.csv。

設置文本限定符「

選擇‘編寫一個查詢來指定數據傳輸’,並在查詢粘貼。 您可以留下下一個設置爲默認值。

隨着出口數據,用Excel打開和保存在Excel格式。

+0

D'oh .. !!!!所以接近..預覽工作完美,但在實際導出期間,我得到這個錯誤:錯誤0xc020802e:數據流任務1:「目標 - testttttt_csv.Inputs [平面文件目的地輸入] .Columns [Main_Content]」的數據類型是DT_NTEXT,這不是支持ANSI文件,使用DT_TEXT代替並使用數據轉換組件將數據轉換爲DT_NTEXT (SQL Server導入和導出嚮導) – Ads

0

我能想出的最好的辦法是選擇所有的行,做一個拷貝爲XML。

將其粘貼到記事本文件並保存它作爲一個XML文件。 然後從excel和voila中打開該XML文件!至少我如何得到我的文件。

0

我發現最簡單的解決方案是在查詢中添加雙引號;

SELECT '"'+MYCHARACTERDATA+'"' FROM MYTABLE 

如果您的電子表格,您可以使用自定義的文本識別符,那麼你可以使用一個更奇特的人物像|以避免文中出現雙引號。

Daft..SSMS應該以正確的CSV格式導出帶引號的文本字段並在這些字段中正確地轉義引號。

相關問題