none
Inserção Ordenada de Dados Em Tabela Temporária Via Bulk Insert RRS feed

  • 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!

    quarta-feira, 1 de outubro de 2014 13:24

Respostas

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

    quarta-feira, 1 de outubro de 2014 14:32
  • 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

     
    quarta-feira, 1 de outubro de 2014 14:50
  • 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

    terça-feira, 23 de dezembro de 2014 14:17
  • Deleted
    terça-feira, 23 de dezembro de 2014 18:01