sql server - tutorial - ¿Cómo convierto la cadena "NULL" en un archivo plano a DATETIME o DATETIME2?
ssis tutorial sql server 2016 (1)
tl; dr : ¿Cómo convierto "NULL" en un archivo plano a NULL en SSDT / SSIS?
En SSMS, ejecute este código:
/* 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
Configure SSMS para crear resultados para archivar como CSV con encabezados: Herramientas -> Opciones -> Resultados de la consulta -> Servidor SQL -> Resultados a texto: menú desplegable delimitado por comas, marque Incluir encabezados de columna en el conjunto de resultados.
Su salida será similar a:
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
En SSDT, configure una conexión de archivo plano, "pestaña" avanzada, establezca los tipos de columna en DT_DBTIMESTAMP para DT, DT_DBTIMESTAMP2 para DT2.
(Pregunta complementaria: ¿alguna idea de por qué el SSDT invariablemente se equivoca y establece ambas columnas para DT_DATE? Claramente, las columnas tienen un componente de tiempo).
En la fuente del archivo plano, configure RetainNulls = True (aunque creo que esto es irrelevante ya que no tengo nulos verdaderos, es decir, una columna en blanco que no contiene datos).
¿Cómo obtengo SSDT para crear los mismos resultados en #objetivo que obtengo en SSMS? IOW, necesito convertir el texto "NULL" a un NULL "apropiado" en el objetivo.
Mis preferencias:
- trucos de configuración dentro de la conexión de archivo plano y / o fuente de archivo plano,
- columna derivada (necesito ayuda con la derivación),
- componente de script
Tendrá que tirar de las columnas en su origen de archivo plano como cadenas (por ejemplo, [DT_STR]) y luego convertirlas utilizando una transformación de columna derivada con las siguientes expresiones:
Expresión para DT:
DT == "NULL" ? NULL(DT_DBTIMESTAMP) : (DT_DBTIMESTAMP) DT
Expresión para DT2:
DT2 == "NULL" ? NULL(DT_DBTIMESTAMP2, 7) : (DT_DBTIMESTAMP2, 7) DT2