stored services procedimiento ejecutar dtsx desde conectar con almacenado sql sql-server tsql ssis ssis-2012

sql - services - Cómo cargar datos agrupados con SSIS



integration services oracle connection (2)

Tengo un origen de datos de archivo plano complicado. Los datos están agrupados, así:

Country City U.S. New York Washington Baltimore Canada Toronto Vancouver

Pero quiero que sea este formato cuando se carga en la base de datos:

Country City U.S. New York U.S. Washington U.S. Baltimore Canada Toronto Canada Vancouver

¿Alguien ha encontrado un problema así antes? ¿Tienes una idea para lidiar con eso?
La única idea que tengo ahora es utilizar el cursor, pero es demasiado lento.
¡Gracias!


La respuesta por cha funcionará, pero aquí hay otra en caso de que necesite hacerlo en SSIS sin tablas temporales / de etapas:

Puede ejecutar su flujo de datos a través de una Transformación de script que usa una variable de nivel de Flujo de datos. A medida que cada fila entra en el script, se comprueba el valor de la columna País.

Si tiene un valor que no está en blanco, rellene la variable con ese valor y páselo en el flujo de datos.

Si el país tiene un valor en blanco, sobrescríbalo con el valor de la variable, que será el último valor del país no en blanco que obtuvo.

EDITAR: busqué su mensaje de error y aprendí algo nuevo sobre los componentes de script (la herramienta de flujo de datos, a diferencia de las tareas de script, la herramienta Control Flow):

La recopilación de ReadWriteVariables solo está disponible en el método PostExecute para maximizar el rendimiento y minimizar el riesgo de conflictos de bloqueo. Por lo tanto, no puede incrementar directamente el valor de una variable de paquete a medida que procesa cada fila de datos. Incremente el valor de una variable local en su lugar, y establezca el valor de la variable de paquete en el valor de la variable local en el método PostExecute después de que se hayan procesado todos los datos. También puede usar la propiedad VariableDispenser para evitar esta limitación, como se describe más adelante en este tema. Sin embargo, escribir directamente en una variable de paquete a medida que se procesa cada fila tendrá un impacto negativo en el rendimiento y aumentará el riesgo de conflictos de bloqueo.

Esto proviene de este artículo de MSDN , que también contiene más información sobre la solución alternativa del Dispensador de Variables, si quiere seguir esa ruta, pero aparentemente le confundo más arriba cuando le dije que puede establecer el valor de la variable del paquete en el script. Debe usar una variable que sea local para la secuencia de comandos y luego cambiarla en el controlador de eventos Post-Ejecutar. No puedo decir por el artículo si eso significa que no podrá leer la variable en el script, y si ese es el caso, entonces el Dispensador de Variables sería la única opción. O supongo que podría crear otra variable a la que la secuencia de comandos tendrá acceso de solo lectura, y establecer su valor a una expresión para que siempre tenga el valor de la variable de lectura-escritura. Aquello podría funcionar.


Sí, es posible. Primero necesita cargar los datos en una tabla con una columna de IDENTIDAD:

-- drop table #t CREATE TABLE #t (id INTEGER IDENTITY PRIMARY KEY, Country VARCHAR(20), City VARCHAR(20)) INSERT INTO #t(Country, City) SELECT a.Country, a.City FROM OPENROWSET( BULK ''c:/import.txt'', FORMATFILE = ''c:/format.fmt'', FIRSTROW = 2) AS a; select * from #t

El resultado será:

id Country City ----------- -------------------- -------------------- 1 U.S. New York 2 Washington 3 Baltimore 4 Canada Toronto 5 Vancouver

Y ahora con un poco de magia CTE recursiva puedes completar los detalles faltantes:

;WITH a as( SELECT Country ,City ,ID FROM #t WHERE ID = 1 UNION ALL SELECT COALESCE(NULLIF(LTrim(#t.Country), ''''),a.Country) ,#t.City ,#t.ID FROM a INNER JOIN #t ON a.ID+1 = #t.ID ) SELECT * FROM a OPTION (MAXRECURSION 0)

Resultado:

Country City ID -------------------- -------------------- ----------- U.S. New York 1 U.S. Washington 2 U.S. Baltimore 3 Canada Toronto 4 Canada Vancouver 5

Actualizar:

Como Tab Alleman sugirió a continuación, se puede lograr el mismo resultado sin la consulta recursiva:

SELECT ID , COALESCE(NULLIF(LTrim(a.Country), ''''), (SELECT TOP 1 Country FROM #t t WHERE t.ID < a.ID AND LTrim(t.Country) <> '''' ORDER BY t.ID DESC)) , City FROM #t a

Por cierto, el archivo de formato para sus datos de entrada es esto (si quiere probar los guiones, guarde los datos de entrada como c: / import.txt y el archivo de formato a continuación como c: / format.fmt):

9.0 2 1 SQLCHAR 0 11 "" 1 Country SQL_Latin1_General_CP1_CI_AS 2 SQLCHAR 0 100 "/r/n" 2 City SQL_Latin1_General_CP1_CI_AS