2015-05-08 91 views
0

必須將表格從MS SQL Server更改爲MySQL(~8M行有8個色標)。其中一個coloumns(DECIMAL Type)導出爲空字符串,並將"bcp"導出爲csv文件。當我使用此csv文件將數據加載到MySQL表時,它失敗,說「不正確的十進制值」。 尋找可能的解決方法或建議。BCP:將空值保留爲' N'

+0

這聽起來像取決於你當前的出口方法;你可能想詳細說明一下。我對MS SQL不是很熟悉,但我認爲「最壞的情況」,你可以將列轉換爲VARCHAR。 – Uueerdo

+0

你想要空值爲換行符?或者你的意思是\ 0? –

+0

@Uueerdo我正在使用以下命令「bcp out -c -T」導出表。 – raka

回答

1

我會創造在MS SQL視圖,其小數列轉換爲VARCHAR列:

CREATE VIEW MySQLExport AS 
SELECT [...] 
    COALESCE(CAST(DecimalColumn AS VARCHAR(50)),'') AS DecimalColumn 
FROM SourceTable; 

然後,導入到MySQL中的臨時表,並使用CASE語句最終INSERT:

INSERT INTO DestinationTable ([...]) 
SELECT [...] 
    CASE DecimalColumn 
     WHEN '' THEN NULL 
     ELSE CAST(DecimalColumn AS DECIMAL(10,5)) 
    END AS DecimalColumn, 
    [...] 
FROM ImportMSSQLStagingTable; 

這是安全的,因爲在導出文件中該值可以是一個空字符串的唯一方法是它是否爲NULL。

請注意,我懷疑你可以通過導出它與COALESCE(CAST(DecimalColumn AS VARCHAR(50)),'\N')作弊,因爲LOAD INFILE會看到'\N',這與\N不一樣。

+0

感謝您的解決方案。我們在這裏談論800萬行。建議的解決方案是否有任何性能影響? csv文件大小接近2gigs。 – raka

+0

@raka絕對會。你會一次性寫你的數據兩次。但我不能想到通過CSV文件執行任何其他方式,因爲bcp和SSIS只允許您使用NULL值的空字段,而MySQL會將其解釋爲0.將其轉換爲varchar可讓您指定一個魔術值爲NULL,但它會顯示爲一個字符串,MySQL在插入時將轉換爲0。沒有辦法解決這個事實,即不能以導入時將被理解爲NULL的格式導出NULL。 –

+0

@raka您可以嘗試在MS SQL中將MySQL服務器設置爲鏈接服務器,但IMX不是那麼容易做到的,並且通常對第三方提供者表現不佳。您可以嘗試使用bcp導出文件,然後使用PowerShell或sed處理.csv文件,並使用字面值爲'\ N'的MySQL替換SQL Server中的魔術值或空字段,但這可能會導致錯誤,具體取決於您的數據或耗時取決於您的實施。您可以嘗試使用SSIS包直接插入數據,但是,您可能還會遇到與數據庫連接有關的問題。 –