Почему bcp выводит значение NULL, если столбец содержит пустую строку и пустую строку, если столбец имеет значение NULL? - PullRequest
8 голосов
/ 29 октября 2009

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

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

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

Ответы [ 3 ]

9 голосов
/ 01 ноября 2009

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

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

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

1 голос
/ 27 сентября 2017

Это связано с разделом «значения по умолчанию» для ППГ:

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 в вашем файле / базе данных.

1 голос
/ 24 февраля 2017
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, в свою очередь, выводит пустой как пустой! Спасибо за вашу помощь. Eric

...