¿Por qué bcp genera un resultado nulo cuando la columna contiene una cadena vacía y una cadena vacía cuando la columna es nula?
-
10-07-2019 - |
Pregunta
Esto me pareció un comportamiento realmente extraño y pasé un tiempo buscando errores en mi código antes de encontrar esto
" saca copias de la tabla o vista de la base de datos 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 nula como una cadena vacía. & Quot; (de 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é es así?
Solución
Ha pasado algún tiempo, pero estoy seguro de que es una compatibilidad con versiones anteriores / legado de regreso a SQL Server 6.5
SQL Server 6.5 no pudo almacenar una cadena vacía: siempre había un espacio. Esto cambió con SQL 7
Entonces '' - > NULL
y '' - > ''
es correcto desde la perspectiva de la historia antigua.
Otros consejos
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 nulo
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é una solución, usando una estructura Case en la consulta sql para cambia la cadena vacía a nula. El BCP a su vez genera el resultado nulo como un vacío! Gracias por tu ayuda. Eric
Esto está relacionado con los "valores predeterminados" sección para BCP:
Por ejemplo, si hay un campo nulo en un archivo de datos, el valor predeterminado para la columna se carga en su lugar.
Tienes que pensar en los días en que importabas 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). Al revés, un NULL de la base de datos debe ser un ''
para los otros sistemas.
Para obtener los datos 'reales' de la base de datos, use el conmutador -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.
Entonces tienes tu ASCII 0x0 en tu archivo / base de datos.