9
votes

Pourquoi la sortie BCP est-elle nulle lorsque la colonne contient une chaîne vide et une chaîne vide lorsque la colonne est null?

Cela m'a frappé comme un comportement vraiment étrange et j'ai passé un moment à vérifier des bugs dans mon code avant de trouver ceci

"Out copie de la table de base de données ou sur la vue dans un fichier. Si vous spécifiez un fichier existant, le fichier est écrasé. Lors de l'extraction de données, notez que l'utilitaire BCP représente une chaîne vide en tant que chaîne NULL et une chaîne null chaîne vide." (de http://msdn.microsoft.com/en-us/library/ms162802 .aspx )

Évidemment, cela m'a permis de résoudre mon problème mais que quelqu'un peut-il penser ou que quelqu'un connaisse une raison pour laquelle c'est le cas?


1 commentaires

Stackoverflow.com/Questtions/12588149/... fournit une solution potentielle


3 Réponses :


9
votes

Cela fait quelque temps, mais je suis sûr que c'est une compatibilité / héritage à l'envers Retour à SQL Server 6.5

SQL Server 6.5 n'a pas pu stocker la chaîne vide: il y avait toujours un espace. Cela a changé avec SQL 7

donc '' -> null et '' -> '' est correct d'une perspective antique de l'historique.


0 commentaires

1
votes
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
Send null in place of empty.I find the best solution here:https://bytes.com/topic/sql-server/answers/143738-bcp-inserting-blank-space-empty-string
  I found a work around, using a Case structure in the sql query to
  change empty string to a null. The BCP in turn outputs the resulting
  null as an empty!
  Thanks for your assistance.
  Eric

0 commentaires

1
votes

Ceci est lié à la section "Valeurs par défaut" pour BCP:

https://docs.microsoft.com/en-us/sql/relante-databases/import-export/keefault-nulls-or-ujust-default-values-during-bulk -import-sql-serveur

Par exemple, s'il existe un champ NULL dans un fichier de données, la valeur par défaut de la colonne est chargée à la place.

Vous devez repenser à des jours où importer des fichiers texte simples d'autres systèmes étranges. BCP traduit '' comme "non défini" (= données manquantes) et définit une null dans la base de données (= données manquantes). L'inverse dans une nulle de la base de données doit être un '' pour les autres systèmes.

Pour obtenir les données «réelles» de la base de données Utilisez le commutateur -k :

https://docs.microsoft.com/en-us/sql/relational-databases/import-export/set-nulls-or-ujust-default-values-During -BULK-Import-SQL-Server # Garder_nulls

Les qualificatifs suivants Spécifiez qu'un champ vide dans le fichier de données conserve sa valeur null pendant l'opération d'importation en vrac, plutôt que d'hériter une valeur par défaut (le cas échéant) pour les colonnes de table.

Ensuite, vous avez votre ASCII 0x0 dans votre fichier / base de données.


0 commentaires