web-dev-qa-db-fra.com

Comment importer des blancs en tant que null au lieu de zéros lors de l'importation de txt à l'aide de l'assistant

J'utilise Import Wizard pour charger un fichier texte et j'ai besoin que les blancs dans les champs entiers soient nuls, mais seuls des zéros sont insérés.

Comment l'importer correctement?

8
Vladimir

Malheureusement, ce n'est pas possible si vous insistez pour utiliser l'Assistant, vous devrez modifier le package à l'aide de Visual Studio.

Il existe une option "garder les valeurs nulles" lors de la modification du package dans Visual Studio

Compte tenu de ce fichier .csv:

StringField,IntField
a,1
b,5
c,
d,6
e,
f,8
g,
h,
i,10
j,

et cette définition de table

CREATE TABLE [dbo].[NullTest](
    [StringField] [varchar](50) NULL,
    [IntField] [int] NULL
) ON [PRIMARY]

GO

Lorsque vous importez les données à l'aide de l'assistant, les valeurs nulles sont converties en 0

Cependant, si à la fin de l'assistant vous sélectionnez "enregistrer le package sous" au lieu de "exécuter immédiatement" comme dans cet écran

enter image description here

Le fichier peut être enregistré quelque part sur le système de fichiers.

Si vous créez ensuite un nouveau projet Integration Services, vous pouvez ajouter un package existant comme celui-ci

enter image description here

Si vous accédez au fichier que vous venez d'enregistrer et que vous le visualisez, vous verrez une tâche de flux de données (vous verrez également une tâche d'exécution SQL si vous avez choisi de créer la table au lieu de l'ajouter à une table existante)

enter image description here

Double-cliquez sur le flux de données pour le modifier et double-cliquez sur la source de données pour cocher l'option "conserver les valeurs nulles"

enter image description here

Double-cliquez ensuite sur la destination pour afficher les propriétés, puis définissez la propriété "Conserver les valeurs NULL" sur true.

enter image description here

Si vous cliquez ensuite sur la flèche verte dans la barre d'outils ou sélectionnez déboguer> démarrer le débogage dans le menu pour exécuter votre package, le résultat final est le suivant

enter image description here

Au final, l'assistant n'est qu'un assistant. Il génère un package SSIS pour vous et choisit certaines valeurs par défaut, malheureusement pas les valeurs par défaut que vous souhaitez.
Si vous souhaitez conserver les valeurs nulles, il n'y a pas vraiment d'autre moyen que de modifier le package avec Visual Studio.

Là encore, il peut être plus facile de simplement créer le package vous-même dans Visual Studio ou d'utiliser la solution T-SQL de @ MaxVernon.

SI vous avez au moins SSMS v 17.3 et que vous importez dans une nouvelle table, vous pouvez utiliser Assistant Importation de fichier plat vers SQL pour cela.

L'exécuter sur le fichier CSV dans la réponse de Tom.

enter image description here

Avec le tableau résultant ressemblant à

enter image description here

6
Martin Smith

Je vois que vous essayez d'utiliser le Wizard pour importer des données. Vous feriez peut-être mieux de créer manuellement la table avec les définitions de colonne que vous désirez et d'utiliser le T-SQL BULK INSERT commande pour importer les données.

 USE tempdb;

 CREATE TABLE dbo.TestSource
 (
   SomeNumber INT NULL
 );

J'ai créé un exemple de fichier en texte brut nommé C:\temp\test.txt qui contient les lignes suivantes:

 1

 3
 4

 6
 7

 9

Cette instruction importe les lignes du fichier texte dans la table TestSource:

 BULK INSERT dbo.TestSource
    FROM 'C:\temp\test.txt'
    WITH (
       DATAFILETYPE = 'char',
       FIELDTERMINATOR = ',',
       KEEPNULLS
    );

Cela montre le contenu une fois l'importation terminée:

 SELECT *
 FROM dbo.TestSource;

enter image description here

6
Max Vernon