2009-10-29 323 views
7

這讓我感到非常奇怪的行爲,我花了一段時間檢查我的代碼中的錯誤之前,我發現這當列爲空時,爲什麼bcp輸出爲null,而列爲空時爲空?

「從數據庫表或視圖複製到一個文件如果指定一個現有的文件,文件在提取數據時,請注意bcp實用程序將空字符串表示爲空字符串,並將空字符串表示爲空字符串。 (從http://msdn.microsoft.com/en-us/library/ms162802.aspx

很明顯,這使我能夠解決我的問題,但任何人都可以想到或有人知道爲什麼會出現這種情況?

+0

http:// stackoverflow。com/questions/12588149/how-to-make-microsoft-bcp-export-empty-string-instead-of-a-nul-char提供了一個潛在的解決方案 – Dan 2013-09-12 13:00:25

回答

8

它已經一段時間了,但我敢肯定,這是一個向後兼容/遺留回來到SQL Server 6.5

SQL Server 6.5中無法存儲空字符串:總有一個空間。這改變了SQL 7

所以'' -> NULL' ' -> ''是從古代歷史的角度來看是正確的。

0
SELECT ARTICULO as Articulo, 
     case when rtrim(CCOLOR) = '' then null else rtrim(CCOLOR) end as Color, 
     case when rtrim(TALLE) = '' then null else rtrim(TALLE) end as Talle, 
from precios 

發送null代替空。

我在這裏找到了最好的解決方案:

https://bytes.com/topic/sql-server/answers/143738-bcp-inserting-blank-space-empty-string

我發現周圍的工作,使用SQL查詢的個案結構 變空字符串爲空。 BCP依次輸出結果爲空的 null! 感謝您的協助。 埃裏克

0

這是關係到「默認值」部分,BCP:

https://docs.microsoft.com/en-us/sql/relational-databases/import-export/keep-nulls-or-use-default-values-during-bulk-import-sql-server

例如,如果在數據文件中的空場,爲默認值該列被加載。

你必須回想從其他怪異系統導入純文本文件的日子。 BCP將''轉換爲「未定義」(=缺失數據)並在數據庫中設置NULL(=缺失數據)。對於其他系統來說,來自數據庫的NULL的另一種方法必須是''

要得到「真實」的數據從數據庫中使用-k開關:

https://docs.microsoft.com/en-us/sql/relational-databases/import-export/keep-nulls-or-use-default-values-during-bulk-import-sql-server#keep_nulls

下預選賽指定大部分過程中數據文件的空場保留其空值-import操作,而不是繼承表列的默認值(如果有)。

然後你的文件/數據庫中有你的ASCII碼0x0。

相關問題