2009-10-29 19 views
7

Esto me pareció un comportamiento realmente extraño y pasé un tiempo buscando errores en mi código antes de encontrar¿Por qué la salida de bcp es nula cuando la columna contiene una cadena vacía y una cadena vacía cuando la columna es nula?

"copias de la tabla de la base de datos o ver en un archivo. Si especifica un archivo existente, el archivo se sobrescribe. Al extraer datos, tenga en cuenta que la utilidad bcp representa una cadena vacía como nula y una cadena nula como una cadena vacía ". (desde http://msdn.microsoft.com/en-us/library/ms162802.aspx)

Obviamente, esto me permitió solucionar mi problema, pero ¿alguien puede pensar o alguien sabe por qué este es el caso?

+0

http: // stackoverflow.com/questions/12588149/how-to-make-microsoft-bcp-export-empty-string-instead-of-a-nul-char proporciona una solución potencial – Dan

Respuesta

8

Ha sido un tiempo, pero estoy seguro de que es una compatibilidad hacia atrás/legado de nuevo a SQL Server 6.5

SQL Server 6.5 no podía almacenar cadena vacía: siempre había un espacio. Esto cambió con SQL 7

Así que '' -> NULL y ' ' -> '' es correcto desde una perspectiva de historia antigua.

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 

Enviar null en lugar de vacío.

puedo encontrar la mejor solución a este problema:

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

He encontrado una solución alternativa, utilizando una estructura de la caja en la consulta SQL para el cambio cadena vacía a un valor nulo. ¡El BCP a su vez emite el resultado nulo como un vacío! Gracias por su ayuda. Eric

0

Esto se relaciona con la sección "valores por defecto" para el BCP:

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

Por ejemplo, si hay un campo nulo en un archivo de datos, el valor por defecto para la columna se carga en su lugar.

Tiene que pensar en los días en que importaba archivos de texto sin formato de otros sistemas raros. BCP traduce '' como "no definido" (= datos faltantes) y establece un NULL en la base de datos (= datos faltantes). A la inversa, un NULL de la base de datos debe ser '' para los demás sistemas.

para obtener los datos 'reales' de la base de datos utilice el interruptor -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

Los siguientes calificadores especifican que un campo vacío en el archivo de datos conserva su valor nulo durante la mayor -importar la operación, en lugar de heredar un valor predeterminado (si lo hay) para las columnas de la tabla.

Luego tiene su ASCII 0x0 en su archivo/base de datos.

Cuestiones relacionadas