sql-server - tutorial - ssis video



Comment puis-je convertir la chaîne "NULL" dans un fichier plat à DATETIME ou DATETIME2? (1)

tl; dr : Comment convertir "NULL" dans un fichier plat en NULL dans SSDT / SSIS?

Dans SSMS, exécutez ce code:

/* Run once
SET NOCOUNT ON
CREATE TABLE #source (DT DATETIME, DT2 DATETIME2)
CREATE TABLE #target (DT DATETIME, DT2 DATETIME2)
INSERT INTO #source
VALUES (GETDATE(),GETDATE()),(NULL,NULL),(GETDATE(),'9999-12-31 23:59:59')
*/
-- Cntl-Shift-F, results to CSV with headers
SELECT * FROM #source  

-- Cntl-D, results to grid
INSERT INTO #target
SELECT * FROM #source
SELECT * FROM #target

-- Prep for next run
TRUNCATE TABLE #target

Configurez SSMS pour créer des résultats à classer au format CSV avec en-têtes: Outils -> Options -> Résultats de la requête -> SQL Server -> Résultats au texte: pulldown pulldown, cochez Inclure les en-têtes de colonne dans le jeu de résultats.

Votre sortie sera similaire à:

DT,DT2
2017-11-16 10:09:31.997,2017-11-16 10:09:31.9970000
NULL,NULL
2017-11-16 10:09:31.997,9999-12-31 23:59:59.0000000

Dans SSDT, configurez une connexion de fichier à plat, onglet "Avancé", définissez les types de colonnes à DT_DBTIMESTAMP pour DT, DT_DBTIMESTAMP2 pour DT2.

(Question secondaire: toute idée que SSDT se trompe invariablement, et définit les deux colonnes à DT_DATE? Clairement les colonnes ont un composant de temps.)

Dans la source du fichier plat, configurez RetainNulls = True (bien que je pense que ce n'est pas pertinent car je n'ai pas de valeurs nulles vraies, c'est-à-dire une colonne vide ne contenant aucune donnée.

Comment obtenir SSDT pour créer les mêmes résultats dans #target que je reçois dans SSMS? IOW, j'ai besoin de convertir le texte "NULL" en un "correct" NULL dans la cible.

Mes préférences:

  1. tromperie de configuration dans la connexion de fichier plat et / ou la source de fichier plat,
  2. colonne dérivée (j'ai besoin d'aide pour la dérivation),
  3. composant de script.

Vous devez insérer les colonnes dans votre source de fichier plat en tant que chaînes (par exemple, [DT_STR]), puis les convertir en utilisant une transformation de colonne dérivée avec les expressions suivantes:

Expression pour DT:

DT == "NULL" ? NULL(DT_DBTIMESTAMP) : (DT_DBTIMESTAMP) DT

Expression pour DT2:

DT2 == "NULL" ? NULL(DT_DBTIMESTAMP2, 7) : (DT_DBTIMESTAMP2, 7) DT2




flatfilesource