必須將表格從MS SQL Server更改爲MySQL(~8M行有8個色標)。其中一個coloumns(DECIMAL Type)導出爲空字符串,並將"bcp"
導出爲csv文件。當我使用此csv文件將數據加載到MySQL表時,它失敗,說「不正確的十進制值」。 尋找可能的解決方法或建議。BCP:將空值保留爲' N'
回答
我會創造在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
不一樣。
感謝您的解決方案。我們在這裏談論800萬行。建議的解決方案是否有任何性能影響? csv文件大小接近2gigs。 – raka
@raka絕對會。你會一次性寫你的數據兩次。但我不能想到通過CSV文件執行任何其他方式,因爲bcp和SSIS只允許您使用NULL值的空字段,而MySQL會將其解釋爲0.將其轉換爲varchar可讓您指定一個魔術值爲NULL,但它會顯示爲一個字符串,MySQL在插入時將轉換爲0。沒有辦法解決這個事實,即不能以導入時將被理解爲NULL的格式導出NULL。 –
@raka您可以嘗試在MS SQL中將MySQL服務器設置爲鏈接服務器,但IMX不是那麼容易做到的,並且通常對第三方提供者表現不佳。您可以嘗試使用bcp導出文件,然後使用PowerShell或sed處理.csv文件,並使用字面值爲'\ N'的MySQL替換SQL Server中的魔術值或空字段,但這可能會導致錯誤,具體取決於您的數據或耗時取決於您的實施。您可以嘗試使用SSIS包直接插入數據,但是,您可能還會遇到與數據庫連接有關的問題。 –
- 1. 如果將值保留爲空,CodeIgniter
- 2. Excel - 如果值爲0,則保留空白,但值爲0.03時保留空白
- 3. 的Sybase BCP出空值
- 4. @ManagedProperty保留爲空
- 5. 組行但保留值不爲空
- 6. Zend表格文本值保留爲空
- 7. Oracle sql - 將值賦給空值或保留值,如果不爲空
- 8. GenericJson不保留空值
- 9. 根據ID將多行變爲單行,並保留空值
- 10. API密鑰保留爲空
- 11. 引用保留爲空
- 12. Awk保留空行
- 13. 將字符串設置爲「」或將其保留爲空?
- 14. 將NA替換爲空白,但將類保留爲數字R
- 15. 將表格列保留爲空時,將其索引爲唯一
- 16. JSON保留一行n
- 17. 保留\ n在jsp頁面
- 18. 如何在Python中將n行xlsx轉換爲csv,同時保留日期值
- 19. 如何在參數保留爲空時傳遞空值
- 20. 保留哈希值保留
- 21. 爲什麼GCC保留空功能?
- 22. 將excel保存爲xml時保留空單元
- 23. 如何在使用BeanUtils.copyProperties時爲數值保留空值?
- 24. 在寫入JSON的時候保留鍵值爲空的值
- 25. 即使模型值爲空,TextBoxFor Helper仍保留以前的值
- 26. 將heatmap2中的零值保留爲無值
- 27. Biml - 在FlatFilesource中保留空值選項
- 28. CodeMirror保留空行
- 29. XML保留空白
- 30. 我怎麼fprintf中保留空間,空數值?
這聽起來像取決於你當前的出口方法;你可能想詳細說明一下。我對MS SQL不是很熟悉,但我認爲「最壞的情況」,你可以將列轉換爲VARCHAR。 – Uueerdo
你想要空值爲換行符?或者你的意思是\ 0? –
@Uueerdo我正在使用以下命令「bcp out -c -T」導出表。 –
raka