sql - plano - ¿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?
importar archivo csv a sql server (3)
Esto me pareció un comportamiento realmente extraño y pasé un tiempo buscando errores en mi código antes de encontrar esto
"copias de la tabla de la base de datos o vista a 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 vacía 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 una razón por la cual este es el caso?
Ha pasado un tiempo, pero estoy seguro de que es una compatibilidad / legado retroactivo con SQL Server 6.5
SQL Server 6.5 no pudo 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.
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.
Encuentro la mejor solución aquí:
https://bytes.com/topic/sql-server/answers/143738-bcp-inserting-blank-space-empty-string
Encontré un trabajo alternativo, usando una estructura Case en la consulta sql para cambiar la cadena vacía a un valor nulo. ¡El BCP a su vez emite el nulo resultante como un vacío! Gracias por tu ayuda. Eric
Esto está relacionado con la sección de "valores predeterminados" para BCP:
Por ejemplo, si hay un campo nulo en un archivo de datos, se carga el valor predeterminado para la columna.
Debe recordar los días en que importó archivos de texto sin formato de otros sistemas extraños. 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 otros sistemas.
Para sacar los datos ''reales'' de la base de datos use el -k
:
Los siguientes calificadores especifican que un campo vacío en el archivo de datos conserva su valor nulo durante la operación de importación masiva, 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.