Почему bcp выводит null, когда столбец содержит пустую строку, и пустую строку, когда столбец имеет значение null?

Это показалось мне действительно странным поведением, и я потратил некоторое время на поиск ошибок в своем коде, прежде чем нашел это.

"копирует из таблицы базы данных или представления в файл. Если вы укажете существующий файл, файл будет перезаписан. При извлечении данных обратите внимание, что утилита bcp представляет пустую строку как нулевую, а нулевую строку как пустую строку. " (из http://msdn.microsoft.com/en-us/library/ms162802.aspx)

Очевидно, это позволило мне решить мою проблему, но может ли кто-нибудь подумать или кто-нибудь знает причину, почему это так?


person David Hayes    schedule 29.10.2009    source источник
comment
stackoverflow.com/questions/12588149/ предоставляет потенциальное решение   -  person Dan    schedule 12.09.2013


Ответы (3)


Прошло некоторое время, но я уверен, что это обратная совместимость/устаревшая версия SQL Server 6.5.

SQL Server 6.5 не мог хранить пустую строку: всегда был один пробел. Это изменилось с SQL 7

Так что '' -> NULL и ' ' -> '' верны с точки зрения древней истории.

person gbn    schedule 01.11.2009

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

Я нашел обходной путь, используя структуру Case в запросе sql, чтобы изменить пустую строку на нуль. BCP, в свою очередь, выводит результирующий нуль как пустой! Спасибо за вашу помощь. Эрик

person Diego Palat    schedule 24.02.2017

Это связано с разделом «значения по умолчанию» для 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

Следующие квалификаторы указывают, что пустое поле в файле данных сохраняет свое нулевое значение во время операции массового импорта, а не наследует значение по умолчанию (если оно есть) для столбцов таблицы.

Тогда у вас есть ASCII 0x0 в вашем файле/базе данных.

person Bernhard    schedule 27.09.2017