Usuário com melhor resposta
Inserção Ordenada de Dados Em Tabela Temporária Via Bulk Insert

Pergunta
-
Bom dia,
Um dos desenvolvedores tem uma rotina que faz bulk insert de um arquivo de textos para uma tabela temporária, depois ele criar um campo identity nesta tabela temporária para que os dados fiquem ordenados conforme devem.
Tenho dois servidores idênticos com SQL Server 2008 R2 SP2, um de PRD e outro de HML, no PRD não funciona a ordenação, os dados fica em ordem diferente, porém em HML funciona perfeitamente.
Fiz um teste tirando a tabela temporária e passando para física, resolveu o problema. Ai vem a pergunta.
Alguém sabe se isto é comportamento padrão do SQL ou alguma limitação das #TempTables, tipo, que ele não garanta a ordem de inserção?
Ah, vale lembrar que este processo funcionava em PRD também, de uma hora para outra parou de funciona!
Respostas
-
Deleted
- Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 30 de dezembro de 2014 12:58
- Marcado como Resposta Durval RamosModerator sábado, 7 de março de 2015 04:04
Todas as Respostas
-
Ronald,
Uma pergunta:
Você falou que esta utilizando uma Temp Table para armazenar os dados e depois que os mesmos estão inseridos você esta criando uma coluna identity?
Então quando você se refere a ordenação, esta querendo dizer em relação ao Identity ou ao registros que estão inseridos na sua tabela?
Você poderia mostrar a estrutura do seu código?
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com
-
Oi Junior,
Não sei te responder ao certo porque ele utiliza o identity.
Segue o código.
BEGIN
set xact_abort on
set nocount on
--
declare @Anexo varchar(30)
,@Assunto varchar(100)
,@AssuntoVMovs varchar(100)
,@AssuntoErro varchar(100)
,@CarCR char(1) = char(13) -- carriage return
,@Cliente varchar(12)
,@CodMsg varchar(3)
,@Comando varchar(300)
,@Consulta varchar(1000)
,@Contrato varchar(10)
,@Corpo varchar(500)
,@CPF varchar(11)
,@CPFCNPJ varchar(14)
,@Destinatario varchar(50)
,@DirArqRecCredProc varchar(200)
,@DirArqSPC varchar(250)
,@DirReceb varchar(100)
,@DirRecCred varchar(100)
,@DtHrInclusao smalldatetime = GetDate()
,@DtMovArq smalldatetime
,@DtMovArqEdt varchar(10)
,@DtMovArqTxt varchar(8)
,@DtMovMax smalldatetime
,@Erro varchar(200)
,@HistErrEnv char(4) = '4402'
,@HistNeg char(4) = '0104'
,@HistReab char(4) = '0105'
,@Hoje smalldatetime = convert(varchar(10),GetDate(),120)
,@HojeAAAAMMDD char(8) = convert(varchar(8) ,GetDate(),112)
,@Horario char(8)
,@IdArqNegativacao int
,@IdContrato int
,@IdReg int
,@IdRetornoSPC int
,@IdSitRetorno smallint
,@IdSitSolicitacao smallint
,@IdSolicitacao int
,@InArqInconsist char(1) = 'N'
,@InContinua char(1) = 'N'
,@InTemMovsCOper char(1) = 'N'
,@InTipo char(1) = 'R' -- retorno
,@InTipoOperacao smallint
,@Linha varchar(549)
,@Negativador varchar(7) = 'ORGAO'
,@NomeArqSPC varchar(50) = 'ARQUIVO.TXT'
,@NomeArqSPCProc varchar(50)
,@NomeArqSPCProcM varchar(50)
,@QtdManut bigint
,@QtdManutTxt varchar(10)
,@QtdManutCalc bigint
,@QtdManutEfet bigint
,@QtdManutEfetTxt varchar(10)
,@QtdMov smallint = 0
,@QtdRetCliNaoCad smallint
,@QtdRetErroEnv smallint
,@QtdRetGer smallint
,@QtdRetIncons smallint
,@QtdRetNaoCrit smallint
,@QtdRetNegJaEfet smallint
,@QtdRetNegNaoSol smallint
,@QtdRetOk smallint
,@QtdRetReabJaEfet smallint
,@QtdRetReabNaoNeg smallint
,@QtdRetReabNaoSol smallint
,@RetornoExec smallint
,@SeqArqMax bigint
,@SeqArquivo bigint
,@SeqArquivoTxt varchar(10)
,@SeqLinha int = 0
,@SeqLinhaMax int = 0
,@SeqLinhaTxt varchar(6)
,@SeqTrans int
,@SeqTransTxt varchar(6)
,@SeqTransAnt int = 0
,@TpDev varchar(1)
,@TpOcorr smallint
,@TpOcorrTxt varchar(2)
,@TpOper smallint
,@TpOperTxt varchar(1)
,@TpRegistro varchar(3)
,@TpRegistroAnt varchar(3) = '999'
,@TpServico varchar(3)
,@TxtMsg varchar(200)
,@VersaoProt varchar(7)
--
select @Assunto = 'ASSUNTO '+convert(varchar(10),DataMovimento,103)
,@AssuntoErro = 'MENSAGEM DE ERRO - '+convert(varchar(10),DataMovimento,103)
,@DirReceb = dg.Conteudo
,@DirRecCred = dr.Conteudo
,@DirArqRecCredProc = dp.Conteudo
,@NomeArqSPCProc = replace(@NomeArqSPC,'.txt','')+'_Proc'+@HojeAAAAMMDD+'.txt'
from Parametros as pr with(NoLock)
,Parametros_Gerais as dg with(NoLock)
,Parametros_Gerais as dr with(NoLock)
,Parametros_Gerais as dp with(NoLock)
where dg.Nome = 'A'
and dr.Nome = 'B'
and dp.Nome = 'C'
--
select @DirArqSPC = @DirRecCred+'\'+@NomeArqSPC
create table #TmpArqSPC(Linha char(549))
select @Comando = 'bulk insert #TmpArqSPC from '''+@DirArqSPC+''' with(RowTerminator = '''+NChar(10)+''')'
exec(@Comando)alter table #TmpArqSPC
add id int identity(1,1)
/*
select Linha
from #TmpArqSPC
*/
--
END- Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 23 de dezembro de 2014 14:17
- Não Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 23 de dezembro de 2014 14:17
-
Ronald,
Porque você esta utilizando o set xact_abort on?
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com
-
Deleted
- Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 30 de dezembro de 2014 12:58
- Marcado como Resposta Durval RamosModerator sábado, 7 de março de 2015 04:04