/ / Importación de datos de informes agrupados a la base de datos - servidor SQL, base de datos, importación, ssis

Importación de datos de informes agrupados a la base de datos - sql-server, database, import, ssis

Mi empresa recibe datos de un cliente que esno podemos proporcionar datos en ningún formato directo, por lo que tenemos que importar varios informes que están en un diseño agrupado como el que se muestra a continuación. Tenemos que desarrollar métodos internos para desagrupar el informe y luego importar los datos para obtener todos los datos que necesitamos. Actualmente, un miembro de mi equipo está utilizando MS Access / VBA para generar los registros detallados necesarios, pero quiero transferir esto a un proceso automatizado y basado en el servidor. Estamos utilizando SQL Server 2008R2 para el almacenamiento y me gustaría usar SSIS para realizar la tarea. ¿Alguien sabe de alguna manera que pueda generar los registros detallados e importar los datos directamente a SQL Server?

enter image description here

Respuestas

1 para la respuesta № 1

Hmm - bueno definitivamente tendrás que hacer algoajuste programático del conjunto de datos para agregar esa fecha de grupo a la línea de detalle. No estoy seguro de cómo importará el xlsx, pero recomendaría primero usar solo un paquete SSIS y luego hacer los ajustes en una tarea de script como la "mejor" manera de hacerlo. Ver aquí sobre cómo manejar Excel en tareas SSIS Script.

Si no sabes SSIS o sobre todo programación.Sin embargo, su próxima mejor apuesta (en mi opinión) es simplemente importar los datos a una tabla de preparación, hacer las manipulaciones con T-SQL y luego insertar esa tabla en su tabla principal. Hice un Fiddle de SQL de esto aquí.

CREATE TABLE ActivitySummary
(
id int identity(1,1),
activity_date date,
activity varchar(100),
paid_time decimal(5,2),
unpaid_time decimal(5,2),
total_time decimal(5,2)
)

CREATE TABLE ActivitySummary_STG
(
id int identity(1,1),
activity_date date,
activity varchar(100),
paid_time decimal(5,2),
unpaid_time decimal(5,2),
total_time decimal(5,2)
)
GO

-- Simulate import of Excel sheet into staging table
truncate table ActivitySummary_STG;
GO

INSERT INTO ActivitySummary_STG (activity_date, activity, paid_time, unpaid_time, total_time)
select "8/14/17",null,null,null,null
UNION ALL
select null,"001 Lunch",0,4.4,4.4
UNION ALL
select null,"002 Break",4.2,0,4.2
UNION ALL
select null,"007 System Down",7.45,0,7.45
UNION ALL
select null,"019 End of Work Day",0.02,0,0.02
UNION ALL
select "8/15/17",null,null,null,null
UNION ALL
select null,"001 Lunch",0,4.45,4.45
UNION ALL
select null,"002 Break",6.53,0,6.53
UNION ALL
select null,"007 System Down",0.51,0,0.51
UNION ALL
select null,"019 End of Work Day",0.02,0,0.02
GO

-- Code to massage data
declare @table_count int = (select COALESCE(count(id),0) from ActivitySummary_STG);
declare @counter int = 1;

declare @activity_date date,
@current_date date;

WHILE (@table_count > 0 AND @counter <= @table_count)
BEGIN
select @activity_date = activity_date
from ActivitySummary_STG
where id = @counter;

if (@activity_date is not null)
BEGIN
set @current_date = @activity_date;

delete from ActivitySummary_STG
where id = @counter;
END
else
BEGIN
update ActivitySummary_STG SET
activity_date = @current_date
where id = @counter;
END

set @counter += 1;
END

INSERT INTO ActivitySummary (activity_date, activity, paid_time, unpaid_time, total_time)
select activity_date, activity, paid_time, unpaid_time, total_time
from ActivitySummary_STG;

truncate table ActivitySummary_STG;
GO

select * from ActivitySummary;

1 para la respuesta № 2

Lo haría con un componente de script.

Flujo de datos total:

ExcelSource -> Componente de script (transformación) -> División condicional -> Destino de SQL

En el componente de script:

Consultar cuentaResumen en InputColumns

Añadir ActivityDate como columna de salida.

Script abierto:

fuera de su fila de procesamiento.

Añadir:

public datetime dte;

procesamiento dentro de la fila:

if (DateTime.TryParse(Row.ActivitySummary.ToString()))
{dte=DateTime.Parse(Row.ActivitySummary.ToString());}
else
{Row.ActivityDate = dte;}

Luego agregue una división condicional para eliminar las fechas de actividad nulas