none
Tratamento de dados RRS feed

  • Pergunta

  • Bom dia!

       Estou tendo que tratar dados de uma tabela temporária que contém informações de outro sistema e essa tabela temporária vou criada com todos os campo varchar(max) e a minha tabela esta toda modelada corretamente. Enfim estou fazendo um procedimento genérico para usar em todos os tratamentos de dados aqui da empresa que pega os dados verifica seus campos e depois retorna uma tabela com os campos errados o único proplema e ficar colocando tudo em query dinâmica e queria saber se teria como melhorar o script abaixo.

    --  wkf_celula_central_adm.tratamento_dados 'tb_zsd006_tim_fato','teste_tratamento','wkf_celula_central_adm'
    IF OBJECT_ID ( 'wkf_celula_central_adm.tratamento_dados', 'P' ) IS NOT NULL 
        DROP PROCEDURE wkf_celula_central_adm.tratamento_dados;
    GO

    create procedure wkf_celula_central_adm.tratamento_dados(@tabela_temp varchar(150),@tabela_perm varchar(150),@schema varchar(150))
    as
    begin

    SET NOCOUNT ON;
    --sp_kill
    IF Object_id('tempdb..#mytemp2') IS NOT NULL
          BEGIN
              DROP TABLE #mytemp2
          END
       
       
    IF Object_id('tempdb..#teste') IS NOT NULL
          BEGIN
              DROP TABLE #teste
          END
       
        CREATE TABLE #teste
          (
    valor varchar(max),
    linha int,
    coluna varchar(100),
    esperado varchar(150)
      )

    IF Object_id('tempdb..#mytemp') IS NOT NULL
          BEGIN
              DROP TABLE #mytemp
          END
          

    declare @id bigint 
    declare @sql varchar(max)


    set rowcount 0
     

    SELECT ROW_NUMBER() 
            OVER (ORDER BY 1) AS Row, 
    *
    into #mytemp 
    FROM @tabela_temp----Aqui tem que colocar o nome da tabela o que eu não quero pois quero que seja genérico.... 
    --  e daqui para baixo deveria ser query dinânmica






    set rowcount 1


    select @id = Row from #mytemp


    while @@rowcount <> 0
    begin
        set rowcount 0
        
        declare @column_name varchar(max)
        declare @data_type varchar(max)
        declare @character_maximum_length varchar(max)
        
        declare c_cursor cursor for select     
    column_name,
    data_type,
    character_maximum_length
    FROM ss360.INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = @tabela_perm
    AND TABLE_SCHEMA= @schema
    open c_cursor
    fetch next from c_cursor into @column_name,@data_type,@character_maximum_length
    while @@FETCH_STATUS = 0
    begin
    ----------


    --begin try
    if (@character_maximum_length<>null)
    begin 
    set @sql = 'declare @teste varchar(max) set @teste = (SELECT CONVERT('+@data_type+'('+@character_maximum_length+'), ltrim(RTRIM('+@column_name+'))) as coluna from #mytemp where Row = '+ convert(varchar(max),@id)+')'
    begin try 
    exec (@sql)
    end try 
    begin catch
    insert into #teste (coluna) values (@column_name)
    end catch
    end
    else
    begin 
    set @sql = 'declare @teste varchar(max) set @teste = (SELECT CONVERT('+@data_type+', ltrim(RTRIM('+@column_name+'))) as coluna from #mytemp  where Row = '+ convert(varchar(max),@id)+')'
    begin try 
    exec (@sql)
    end try 
    begin catch
    insert into #teste (valor,linha) values (@column_name,@id)
    end catch
    end


    fetch next from c_cursor into @column_name,@data_type,@character_maximum_length
    end
    close c_cursor
    deallocate c_cursor
        
        
        
        
        ----------------------------------------------------------------------------
        
        delete #mytemp where Row = @id
        set rowcount 1
        select @id = Row from #mytemp
    end

    set rowcount 0

    end

    Grato.

    • Movido Fábio Jr quarta-feira, 1 de julho de 2015 20:35 Mais adequado
    quinta-feira, 25 de junho de 2015 13:07

Respostas

Todas as Respostas

  • Consegui evoluir, mas agora o problema é de performance...

    IF OBJECT_ID ( 'wkf_celula_central_adm.tratamento_dados', 'P' ) IS NOT NULL 
        DROP PROCEDURE wkf_celula_central_adm.tratamento_dados;
    GO

    create procedure wkf_celula_central_adm.tratamento_dados( @tabela_temp varchar(150),
    @tabela_perm varchar(150),
    @schema varchar(150),
    @fl_gravacao bit
    )
    as
    begin

    --declare @tabela_temp varchar(150) = 'tb_zsd006_tim_fato'
    --declare @tabela_perm varchar(150) = 'teste_tratamento'
    --declare @schema varchar(150) = 'wkf_celula_central_adm'

    ----------------------------------------------------------------------------------------
    ----------------------- Suporte a Vendas - SS360 ---------------------------------------
    /*
    -- Analista: Rodrigo Silva
    -- Data de criação: 25/06/2015
    -- Data de alteração: 25/06/2015
    -- Descrição: O procedimento tem como funcionalidade o tratamento de dados de importações
    automatizadas ou cargas de dados. Verifica o tipo dos campos da tabela de destino e
    valida o conteúdo da tabela temporária para ver se esta de acordo com com a tabela destino.
    -- Descrição dos campos:
    @tabela_temp : Nome da tabela temporária onde se encontra os dados a serem tratados
    @tabela_perm : Nome da tabela de destino aonde será gravados os dados
    @schema_temp : Scheme ao qual pertence as tabelas
    @fl_gravacao : Flag para controlar os dados gravados. 0 - Todas as linhas devem estar corretas para persistir na tabela,
    1 - Os dados que estão corretos serão gravados.

    */
    ----------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------
    -- Declaração de variáveis 
    ----------------------------------------------------------------------------------------
    --declare @teste02 varchar(max);
    declare @out table(out varchar(max)) -- Tabela utilizada para comparação do tamanho do campo original
    declare @out2 table(out2 varchar(max))-- Tabela utilizada para comparação do tamanho do campo apos tratamento
    ----------------------------------------------------------------------------------------

    -- Seta para não retonar a contagem de linhas afetadas
    SET NOCOUNT ON;
     
    -- Verifica se a tabela existe e caso sim a exclui   
    IF Object_id('tempdb..#Erros') IS NOT NULL
    BEGIN
    DROP TABLE #Erros
    END

    -- Cria a tabela onde será armazenado os dados com os erros   
    CREATE TABLE #Erros
    (
    nome_campo varchar(150) ,
    tipo_campo varchar(150) ,
    tamanho int,
    valor varchar(max),
    linha int
    )


    IF Object_id('tempdb..##mytemp') IS NOT NULL
    BEGIN
    DROP TABLE ##mytemp
    END
          

    declare @id bigint 
    declare @sql varchar(max)
    declare @coluna_order varchar(max)

    set @coluna_order = (select top 1     
    column_name
    FROM ss360.INFORMATION_SCHEMA.COLUMNS WITH (NOLOCK)
    WHERE TABLE_NAME = @tabela_perm
    AND TABLE_SCHEMA= @schema )

    o

    set rowcount 0
     
    exec ('
    SELECT  ROW_NUMBER() 
            OVER (ORDER BY '+@coluna_order+') AS Row, 
    *
    into ##mytemp 
    FROM '+ @schema + '.' + @tabela_temp + ' WITH (NOLOCK)' )



    set rowcount 1


    select @id = Row from ##mytemp WITH (NOLOCK)


    while @@rowcount <> 0
    begin
        set rowcount 0
        
        declare @column_name varchar(max)
        declare @data_type varchar(max)
        declare @character_maximum_length varchar(max)
        
        declare c_cursor cursor for select     
    column_name,
    data_type,
    character_maximum_length
    FROM ss360.INFORMATION_SCHEMA.COLUMNS WITH (NOLOCK)
    WHERE TABLE_NAME = @tabela_perm
    AND TABLE_SCHEMA= @schema 
    open c_cursor
    fetch next from c_cursor into @column_name,@data_type,@character_maximum_length
    while @@FETCH_STATUS = 0
    begin
    ----------
    --begin try
    delete from @out
    delete from @out2

    if (@character_maximum_length is not null)
    begin
    set @sql = 'declare @teste varchar(max) set @teste = (SELECT CONVERT('+@data_type+'('+@character_maximum_length+'), ltrim(RTRIM('+@column_name+'))) as coluna from ##mytemp WITH (NOLOCK) where Row = '+ convert(varchar(max),@id)+')'
    begin try 
    delete from @out
    delete from @out2

    exec (@sql)

    insert into @out
    exec('SELECT '+@column_name+' as coluna from ##mytemp  where Row = ' + @id)

    insert into @out2
    exec ('SELECT CONVERT('+@data_type+'('+@character_maximum_length+'), ltrim(RTRIM('+@column_name+'))) as coluna from ##mytemp where Row = '+ @id )

    if (len((select out from @out)) <> len((select out2 from @out2)))
    RAISERROR (15600,-1,-1, 'mysp_CreateCustomer');


    end try 
    begin catch
    delete from @out
    delete from @out2

    insert into @out
    exec('SELECT '+@column_name+' as coluna from ##mytemp  where Row = ' + @id)
    insert into #Erros (nome_campo,tipo_campo,tamanho,valor,linha) values (@column_name,@data_type,@character_maximum_length,(select * from @out),@id)
    end catch
    end
    else
    begin 
    set @sql = 'declare @teste varchar(max) set @teste = (SELECT CONVERT('+@data_type+', ltrim(RTRIM('+@column_name+'))) as coluna from ##mytemp  where Row = '+ convert(varchar(max),@id)+')'
    begin try

    exec (@sql)

    --if @Cidade <> (SELECT CAST(@Cidade as varchar(50)))
    -- RAISERROR (15600,-1,-1, 'mysp_CreateCustomer');

    end try 
    begin catch
    delete from @out
    delete from @out2
    insert into @out
    exec('SELECT '+@column_name+' as coluna from ##mytemp  where Row = ' + @id)
    insert into #Erros (nome_campo,tipo_campo,tamanho,valor,linha) values (@column_name,@data_type,@character_maximum_length,(select * from @out),@id)
    end catch
    end


    fetch next from c_cursor into @column_name,@data_type,@character_maximum_length
    end
    close c_cursor
    deallocate c_cursor
        
        
        
        
        ----------------------------------------------------------------------------
        
        delete ##mytemp where Row = @id
        set rowcount 1
        select @id = Row from ##mytemp
    end

    set rowcount 0

    select * from #Erros
    end

    segunda-feira, 29 de junho de 2015 14:36
  • Vou mover sua dúvida para a área de SQL.

    Fábio de Paula Junior

    quarta-feira, 1 de julho de 2015 20:34
  • Deleted
    • Marcado como Resposta Cristopher C I_ segunda-feira, 6 de julho de 2015 17:28
    quinta-feira, 2 de julho de 2015 10:13
  • Aqui é o 2008, mas de qualquer forma vou dar uma lida sobre o assunto para quando eu estiver trabalhando com o 2012. 

    Grato.

    quarta-feira, 22 de julho de 2015 13:33
  • Deleted
    • Marcado como Resposta Marcos SJ quarta-feira, 7 de outubro de 2015 18:59
    quarta-feira, 22 de julho de 2015 19:44