visual tutorial studio services new español dtsx create sql-server ssis etl ssdt flatfilesource

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:

  1. trucos de configuración dentro de la conexión de archivo plano y / o fuente de archivo plano,
  2. columna derivada (necesito ayuda con la derivación),
  3. 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