/ / Importando Dados de Relatório Agrupados para Banco de Dados - sql-server, database, import, ssis

Importando Dados de Relatório Agrupados para Banco de Dados - sql-server, database, import, ssis

Minha empresa recebe dados de um cliente que éNão é possível fornecer dados em qualquer formato direto, por isso, temos que importar vários relatórios que estão em um layout agrupado como o abaixo. Temos que desenvolver métodos internos para desagrupar o relatório e depois importar os dados para obter todos os dados de que precisamos. Atualmente, um membro da minha equipe está usando o MS Access / VBA para gerar os registros detalhados necessários, mas quero movê-lo para um processo automatizado e baseado em servidor. Estamos usando o SQL Server 2008R2 para armazenamento e gostaria de usar o SSIS para realizar a tarefa. Alguém sabe de uma maneira que eu possa gerar os registros de detalhes e importar os dados diretamente para o SQL Server?

insira a descrição da imagem aqui

Respostas:

1 para resposta № 1

Hmm - bem, você definitivamente terá que fazer algumasAjuste programático do conjunto de dados para adicionar essa data de grupo à linha de detalhe. Eu não tenho certeza de como você vai importar o xlsx, mas eu recomendaria primeiro apenas usando um pacote SSIS e, em seguida, fazendo os ajustes em uma tarefa de script como a "melhor" maneira de fazer isso. Aqui sobre como lidar com o Excel em tarefas de script do SSIS.

Se você não conhece SSIS ou especialmente programaçãoNo entanto, a próxima melhor aposta (na minha opinião) é apenas importar os dados para uma tabela de teste, fazer as manipulações com o T-SQL e depois inserir essa tabela na sua tabela principal. Aqui.

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 resposta № 2

Eu faria isso com um componente de script.

Fluxo total de dados:

ExcelSource -> Componente de Script (Transformação) -> Divisão Condicional -> Destino de SQL

No componente de script:

Verificar contaResumo em InputColumns

Adicione ActivityDate como coluna de saída.

Script Aberto:

fora do seu processamento de linha.

Adicionar:

public datetime dte;

dentro do processamento de linha:

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

Em seguida, adicione uma divisão condicional para remover datas de atividade nulas