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?
Respostas:
1 para resposta № 1Hmm - 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