none
SP com Pivot, Parametros e INSERT (acordo com as tabelas selecionadas no Pivot) RRS feed

  • Pergunta

  • Boa tarde Pessoal,

    Seguinte, eu sei que na linguagem SQL dá para se fazer qualquer coisa, basta a criatividade e conhecimento. Estou tentando criar uma Storage Procedure, que execute uma consulta Pivot Variável, e insira em outra tabela esses dados consultados, limpando essa tabela antes da execução. Porém, minha maior dificuldade é criar no Insert selecionando as colunas que desejo que sejam incluídas somente as informações do Pivot Variado. Sendo que, na tabela que irá receber as informações já contém todas as colunas possível para inserção.

    Abaixo a consulta com SP:

    CREATE PROCEDURE EventosFolha
    @PLN_Sheet1_$B$2 NUMERIC (4),
    @PLN_Sheet1_$B$3 NUMERIC (2)

    AS

    DECLARE @COLUNAS_PIVOT AS NVARCHAR(MAX), @COMANDO_SQL AS NVARCHAR(MAX)

    SET @COLUNAS_PIVOT =
    STUFF((
    SELECT DISTINCT ',' + QUOTENAME(OP.CODIGO+'-'+OP.DESCRICAO) FROM PFFINANC CP (NOLOCK) INNER JOIN PEVENTO OP (NOLOCK) ON OP.CODCOLIGADA=CP.CODCOLIGADA AND OP.CODIGO=CP.CODEVENTO
    WHERE CP.VALOR<>0 AND OP.PROVDESCBASE<>'B' AND CP.ANOCOMP =@PLN_Sheet1_$B$2 AND CP.MESCOMP =@PLN_Sheet1_$B$3
    FOR XML PATH('')
    ), 1, 1, '')
    PRINT @COLUNAS_PIVOT
    SET @COMANDO_SQL = '
    INSERT INTO EVENTOS (
    SELECT 
    *
    FROM (
    SELECT
    FF.ANOCOMP AS ANO,
    FF.MESCOMP AS MES,
    GC.NOME AS EMPRESA,
    GF.NOME AS FILIAL,
    FU.CHAPA,
    FU.NOME,
    CONVERT(VARCHAR(10), FU.DATAADMISSAO, 103) as DATA_ADMISSAO,
    CASE FU.CODSITUACAO WHEN ''A'' THEN ''Ativo'' WHEN ''D'' THEN ''Demitido'' WHEN ''E'' THEN ''Licença_Maternidade'' WHEN ''F'' THEN ''Férias'' WHEN ''I'' THEN ''Aposentado_Invalidez'' WHEN ''P'' THEN ''Afastado_Previdência'' WHEN ''T'' THEN ''Afastado_Acidente_Trabalho'' WHEN ''L'' THEN ''Licença_s/_Venc'' WHEN ''C'' THEN ''Contrato_de_Trabalho_Suspenso'' WHEN ''U'' THEN ''Outros'' ELSE ''Não'' END SITUACAO,
    CASE FU.CODTIPO WHEN ''A'' THEN ''Autônomo'' WHEN ''B'' THEN ''Temporário_com_redução_de_encargos'' WHEN ''C'' THEN ''Conselheiro'' WHEN ''D'' THEN ''Diretor'' WHEN ''E'' THEN ''Estatutário'' WHEN ''F'' THEN ''Temporário/Comissionista'' WHEN ''I'' THEN ''Cedido'' WHEN ''M'' THEN ''Misto'' WHEN ''N'' THEN ''Normal'' WHEN ''O'' THEN ''Comissionista'' WHEN ''P'' THEN ''Temporário'' WHEN ''R'' THEN ''Rural'' WHEN ''S'' THEN ''Pensionista'' WHEN ''T'' THEN ''Estagiário'' WHEN ''U'' THEN ''Outros'' WHEN ''V'' THEN ''Contrato_Verde/Amarelo'' WHEN ''X'' THEN ''Expatriado'' WHEN ''Z'' THEN ''Aprendiz'' ELSE ''N'' END VINCULO,
    CONVERT(VARCHAR(10), FU.DATADEMISSAO, 103) as DATA_RESCISAO,
    SI.NOME AS SINDICATO,
    SE.CODIGO AS CODIGO_DE_ESTRUTURA,
    SE.DESCRICAO AS CENTRO_DE_CUSTO,
    CAST ((FF.CODEVENTO+EV.DESCRICAO) AS VARCHAR) EVENTO,
    CASE WHEN EV.PROVDESCBASE=''P'' THEN FF.VALOR ELSE FF.VALOR * (-1) END ''VALOR''
    FROM PFUNC FU (NOLOCK)
    INNER JOIN PFFINANC FF (NOLOCK) ON FF.CODCOLIGADA=FU.CODCOLIGADA AND FF.CHAPA=FU.CHAPA 
    INNER JOIN PEVENTO EV (NOLOCK) ON EV.CODCOLIGADA=FF.CODCOLIGADA AND EV.CODIGO=FF.CODEVENTO
    INNER JOIN PSECAO SE (NOLOCK) ON SE.CODCOLIGADA=FU.CODCOLIGADA AND SE.CODIGO=FU.CODSECAO
    INNER JOIN PFUNCAO FC (NOLOCK) ON FC.CODCOLIGADA=FU.CODCOLIGADA AND FC.CODIGO=FU.CODFUNCAO
    LEFT OUTER JOIN PFPERFF FP (NOLOCK) ON FP.CODCOLIGADA = FF.CODCOLIGADA AND FP.ANOCOMP = FF.ANOCOMP AND FP.MESCOMP = FF.MESCOMP AND FP.CHAPA = FF.CHAPA AND FP.NROPERIODO = FF.NROPERIODO
    LEFT OUTER JOIN GCOLIGADA GC ON GC.CODCOLIGADA = FU.CODCOLIGADA
    LEFT OUTER JOIN GFILIAL GF ON GF.CODCOLIGADA = SE.CODCOLIGADA AND GF.CODFILIAL = SE.CODFILIAL
    LEFT OUTER JOIN PSINDIC SI ON SI.CODCOLIGADA = FU.CODCOLIGADA AND SI.CODIGO = FU.CODSINDICATO
    WHERE FF.VALOR<>0
      AND EV.PROVDESCBASE<> ''B'' AND FF.ANOCOMP =@PLN_Sheet1_$B$2 AND FF.MESCOMP =@PLN_Sheet1_$B$3
    )RESULT1
    PIVOT
    (AVG(VALOR) FOR EVENTO IN (' + @COLUNAS_PIVOT + ') ) AS PIVOTTABLE
    ) VALUES (SELECT 
    *
    FROM (
    SELECT
    FF.ANOCOMP AS ANO,
    FF.MESCOMP AS MES,
    GC.NOME AS EMPRESA,
    GF.NOME AS FILIAL,
    FU.CHAPA,
    FU.NOME,
    CONVERT(VARCHAR(10), FU.DATAADMISSAO, 103) as DATA_ADMISSAO,
    CASE FU.CODSITUACAO WHEN ''A'' THEN ''Ativo'' WHEN ''D'' THEN ''Demitido'' WHEN ''E'' THEN ''Licença_Maternidade'' WHEN ''F'' THEN ''Férias'' WHEN ''I'' THEN ''Aposentado_Invalidez'' WHEN ''P'' THEN ''Afastado_Previdência'' WHEN ''T'' THEN ''Afastado_Acidente_Trabalho'' WHEN ''L'' THEN ''Licença_s/_Venc'' WHEN ''C'' THEN ''Contrato_de_Trabalho_Suspenso'' WHEN ''U'' THEN ''Outros'' ELSE ''Não'' END SITUACAO,
    CASE FU.CODTIPO WHEN ''A'' THEN ''Autônomo'' WHEN ''B'' THEN ''Temporário_com_redução_de_encargos'' WHEN ''C'' THEN ''Conselheiro'' WHEN ''D'' THEN ''Diretor'' WHEN ''E'' THEN ''Estatutário'' WHEN ''F'' THEN ''Temporário/Comissionista'' WHEN ''I'' THEN ''Cedido'' WHEN ''M'' THEN ''Misto'' WHEN ''N'' THEN ''Normal'' WHEN ''O'' THEN ''Comissionista'' WHEN ''P'' THEN ''Temporário'' WHEN ''R'' THEN ''Rural'' WHEN ''S'' THEN ''Pensionista'' WHEN ''T'' THEN ''Estagiário'' WHEN ''U'' THEN ''Outros'' WHEN ''V'' THEN ''Contrato_Verde/Amarelo'' WHEN ''X'' THEN ''Expatriado'' WHEN ''Z'' THEN ''Aprendiz'' ELSE ''N'' END VINCULO,
    CONVERT(VARCHAR(10), FU.DATADEMISSAO, 103) as DATA_RESCISAO,
    SI.NOME AS SINDICATO,
    SE.CODIGO AS CODIGO_DE_ESTRUTURA,
    SE.DESCRICAO AS CENTRO_DE_CUSTO,
    CAST ((FF.CODEVENTO+EV.DESCRICAO) AS VARCHAR) EVENTO,
    CASE WHEN EV.PROVDESCBASE=''P'' THEN FF.VALOR ELSE FF.VALOR * (-1) END ''VALOR''
    FROM PFUNC FU (NOLOCK)
    INNER JOIN PFFINANC FF (NOLOCK) ON FF.CODCOLIGADA=FU.CODCOLIGADA AND FF.CHAPA=FU.CHAPA 
    INNER JOIN PEVENTO EV (NOLOCK) ON EV.CODCOLIGADA=FF.CODCOLIGADA AND EV.CODIGO=FF.CODEVENTO
    INNER JOIN PSECAO SE (NOLOCK) ON SE.CODCOLIGADA=FU.CODCOLIGADA AND SE.CODIGO=FU.CODSECAO
    INNER JOIN PFUNCAO FC (NOLOCK) ON FC.CODCOLIGADA=FU.CODCOLIGADA AND FC.CODIGO=FU.CODFUNCAO
    LEFT OUTER JOIN PFPERFF FP (NOLOCK) ON FP.CODCOLIGADA = FF.CODCOLIGADA AND FP.ANOCOMP = FF.ANOCOMP AND FP.MESCOMP = FF.MESCOMP AND FP.CHAPA = FF.CHAPA AND FP.NROPERIODO = FF.NROPERIODO
    LEFT OUTER JOIN GCOLIGADA GC ON GC.CODCOLIGADA = FU.CODCOLIGADA
    LEFT OUTER JOIN GFILIAL GF ON GF.CODCOLIGADA = SE.CODCOLIGADA AND GF.CODFILIAL = SE.CODFILIAL
    LEFT OUTER JOIN PSINDIC SI ON SI.CODCOLIGADA = FU.CODCOLIGADA AND SI.CODIGO = FU.CODSINDICATO
    WHERE FF.VALOR<>0
      AND EV.PROVDESCBASE<> ''B'' AND FF.ANOCOMP =@PLN_Sheet1_$B$2 AND FF.MESCOMP =@PLN_Sheet1_$B$3
    )RESULT1
    PIVOT
    (AVG(VALOR) FOR EVENTO IN (' + @COLUNAS_PIVOT + ') ) AS PIVOTTABLE
    )'
    PRINT @COMANDO_SQL
    execute sp_executesql 
        @COMANDO_SQL, 
        N'@PLN_Sheet1_$B$2 NUMERIC(4), @PLN_Sheet1_$B$3 NUMERIC(2)', 
        @PLN_Sheet1_$B$2 = @PLN_Sheet1_$B$2, @PLN_Sheet1_$B$3 = @PLN_Sheet1_$B$3

    Se alguém tiver alguma idéia, eu agradeço.

    Emerson Fernandes

    quinta-feira, 21 de janeiro de 2021 18:50

Respostas

  • FernandesO,

    Qual é o resultado que esta sendo retornado por esta Storad Procedure?

    A tabela que vai receber os dados, possui a mesma estrutura e tipos de dados retornados pelo Stored Procedure?

    Sem analisar o seu código, pois aparentemente é o mesmo apresentando em outro post, uma alternativa que normalmente utilizamos para capturar o resultado da execução de uma Stored Procedure e inserir em uma tabela, consiste de forma básica, utilizar o comando Insert acompanhado logo abaixo do comando de execução da sua Procedure, veja o exemplo:

    Insert Into SuaTabela(SuasColunas, .... , ....)
    execute sp_executesql 
        @COMANDO_SQL, 
        N'@PLN_Sheet1_$B$2 NUMERIC(4), @PLN_Sheet1_$B$3 NUMERIC(2)', 
        @PLN_Sheet1_$B$2 = @PLN_Sheet1_$B$2, @PLN_Sheet1_$B$3 = @PLN_Sheet1_$B$3
    Go

    Vale ressaltar que as colunas declaradas no Insert, devem respeitar a mesma sequência retornada na Stored Procedure.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta FernandesO quarta-feira, 27 de janeiro de 2021 17:32
    sexta-feira, 22 de janeiro de 2021 12:36

Todas as Respostas

  • FernandesO,

    Qual é o resultado que esta sendo retornado por esta Storad Procedure?

    A tabela que vai receber os dados, possui a mesma estrutura e tipos de dados retornados pelo Stored Procedure?

    Sem analisar o seu código, pois aparentemente é o mesmo apresentando em outro post, uma alternativa que normalmente utilizamos para capturar o resultado da execução de uma Stored Procedure e inserir em uma tabela, consiste de forma básica, utilizar o comando Insert acompanhado logo abaixo do comando de execução da sua Procedure, veja o exemplo:

    Insert Into SuaTabela(SuasColunas, .... , ....)
    execute sp_executesql 
        @COMANDO_SQL, 
        N'@PLN_Sheet1_$B$2 NUMERIC(4), @PLN_Sheet1_$B$3 NUMERIC(2)', 
        @PLN_Sheet1_$B$2 = @PLN_Sheet1_$B$2, @PLN_Sheet1_$B$3 = @PLN_Sheet1_$B$3
    Go

    Vale ressaltar que as colunas declaradas no Insert, devem respeitar a mesma sequência retornada na Stored Procedure.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta FernandesO quarta-feira, 27 de janeiro de 2021 17:32
    sexta-feira, 22 de janeiro de 2021 12:36
  • Bom dia Junior, como vai?

    Essa consulta tem mesmo o mesmo teor que encontrada em outros post, pois um amigo me ajudou a ajustar os parâmetros da variável e funcionou. Só apareceu a necessidade de criação de uma tabela para receber as informações, visto que não conseguiria executar a procedure diretamente pelo meu sistema. Dessa forma ele me sugeriu colocar o insert dentro da variável @COMANDO_SQL, mas como minha consulta é um PIVOT dinâmico, nem sempre vai trazer as mesmas colunas fixas para insert. Por isso eu precisaria informar quais as colunas no INTO, para depois incluir os dados em VALUES. Mas não tenho ideia de como fazer isso. E o Insert precisa estar dentro da SP, pois, devo limpar a tabela e depois inserir os dados na tabela de acordo com os parâmetros informados.

    Para tentar realizar essa operação eu apenas dupliquei a consulta existente no @COMANDO_SQL e inseri os comandos de INSERT. Mas não funcionou.

    O erro que está ocorrendo nesse momento é esse:

    Mensagem 156, Nível 15, Estado 1, Linha 94
    Sintaxe incorreta próxima à palavra-chave 'SELECT'.
    Mensagem 102, Nível 15, Estado 1, Linha 127
    Sintaxe incorreta próxima a ')'.

    Porém eu acho que a sentença do INSERT está incorreta, por isso do erro.

    Emerson Fernandes

    sexta-feira, 22 de janeiro de 2021 14:17
  • FernandesO,

    o que vc pode fazer é colocar into ' + @TBVARIAVEL +' antes do FROM.

    se for sempre uma TB especifica coloca o o INTO a primeira vez para gerar a TB, gerada a TB vc pode tirar o into ' + @TBVARIAVEL +' coloca 

    insert into NOME_TB "a que gerou"

    execute sp_executesql 
        @COMANDO_SQL, 
        N'@PLN_Sheet1_$B$2 NUMERIC(4), @PLN_Sheet1_$B$3 NUMERIC(2)', 
        @PLN_Sheet1_$B$2 = @PLN_Sheet1_$B$2, @PLN_Sheet1_$B$3 = @PLN_Sheet1_$B$3

    sexta-feira, 22 de janeiro de 2021 17:37
  • FernandesO,

    Neste caso a situação é bem diferente, você vai ter que montar o comando de acordo com o que vai ser retornado, mas é este o ponto que esta o problema, pois como é algo dinâmico fica mais complicado.

    Bom em relação aos tipos de dados que você ser retornados, uma alternativa seria utilizar NVarchar() em todos as colunas ou o SQL_Variant, eu particularmente prefiro trabalhar com o SQL_Variant que o tipo de dados genérico utilizado pelo SQL Server.

    Inclusive tem um post no meu blog, publicado a algum tipo de aborda como podemos utilizar o SQL_Variant:
    Como utilizar diversos tipos de dados em uma única coluna no SQL Server | Junior Galvão – MVP – Data Platform (wordpress.com)

    No que do que vai ser definido no comando Insert, o nome da tabela vai ser sempre a mesma ou isso também poderá mudar?

    Recomendo que você analise a possibilidade de utilizar mais uma variável que será utilizada para montar o seu comando de forma dinâmica para depois ser executada.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 22 de janeiro de 2021 19:51
  • Pensei na possibilidade de dropar a tabela no inicio, e sempre criar uma nova tabela, com as informações dinâmicas conforme a consulta, dentro da própria SP. Mas não sei como posso fazer isso.
    sexta-feira, 22 de janeiro de 2021 21:40
  • Ola FernandersO, pode alterar para 

    CREATE PROCEDURE EventosFolha
    @PLN_Sheet1_$B$2 NUMERIC (4),
    @PLN_Sheet1_$B$3 NUMERIC (2)

    AS

    DECLARE @COLUNAS_PIVOT AS NVARCHAR(MAX), @COMANDO_SQL AS NVARCHAR(MAX), @tb varchar(150) = 'TbResultProc' 

    SET @COLUNAS_PIVOT =
    STUFF((
    SELECT DISTINCT ',' + QUOTENAME(OP.CODIGO+'-'+OP.DESCRICAO) FROM PFFINANC CP (NOLOCK) INNER JOIN PEVENTO OP (NOLOCK) ON OP.CODCOLIGADA=CP.CODCOLIGADA AND OP.CODIGO=CP.CODEVENTO
    WHERE CP.VALOR<>0 AND OP.PROVDESCBASE<>'B' AND CP.ANOCOMP =@PLN_Sheet1_$B$2 AND CP.MESCOMP =@PLN_Sheet1_$B$3
    FOR XML PATH('')
    ), 1, 1, '')
    PRINT @COLUNAS_PIVOT
    SET @COMANDO_SQL = ' if exists(select 1 from sysobjects where name = ''' + @tb + '''
    drop table ''' + @tb + '''
    SELECT 
    *
    into  ' + @tb + '
    FROM (
    SELECT
    FF.ANOCOMP AS ANO,
    FF.MESCOMP AS MES,
    GC.NOME AS EMPRESA,
    GF.NOME AS FILIAL,
    FU.CHAPA,
    FU.NOME,
    CONVERT(VARCHAR(10), FU.DATAADMISSAO, 103) as DATA_ADMISSAO,
    CASE FU.CODSITUACAO WHEN ''A'' THEN ''Ativo'' WHEN ''D'' THEN ''Demitido'' WHEN ''E'' THEN ''Licença_Maternidade'' WHEN ''F'' THEN ''Férias'' WHEN ''I'' THEN ''Aposentado_Invalidez'' WHEN ''P'' THEN ''Afastado_Previdência'' WHEN ''T'' THEN ''Afastado_Acidente_Trabalho'' WHEN ''L'' THEN ''Licença_s/_Venc'' WHEN ''C'' THEN ''Contrato_de_Trabalho_Suspenso'' WHEN ''U'' THEN ''Outros'' ELSE ''Não'' END SITUACAO,
    CASE FU.CODTIPO WHEN ''A'' THEN ''Autônomo'' WHEN ''B'' THEN ''Temporário_com_redução_de_encargos'' WHEN ''C'' THEN ''Conselheiro'' WHEN ''D'' THEN ''Diretor'' WHEN ''E'' THEN ''Estatutário'' WHEN ''F'' THEN ''Temporário/Comissionista'' WHEN ''I'' THEN ''Cedido'' WHEN ''M'' THEN ''Misto'' WHEN ''N'' THEN ''Normal'' WHEN ''O'' THEN ''Comissionista'' WHEN ''P'' THEN ''Temporário'' WHEN ''R'' THEN ''Rural'' WHEN ''S'' THEN ''Pensionista'' WHEN ''T'' THEN ''Estagiário'' WHEN ''U'' THEN ''Outros'' WHEN ''V'' THEN ''Contrato_Verde/Amarelo'' WHEN ''X'' THEN ''Expatriado'' WHEN ''Z'' THEN ''Aprendiz'' ELSE ''N'' END VINCULO,
    CONVERT(VARCHAR(10), FU.DATADEMISSAO, 103) as DATA_RESCISAO,
    SI.NOME AS SINDICATO,
    SE.CODIGO AS CODIGO_DE_ESTRUTURA,
    SE.DESCRICAO AS CENTRO_DE_CUSTO,
    CAST ((FF.CODEVENTO+EV.DESCRICAO) AS VARCHAR) EVENTO,
    CASE WHEN EV.PROVDESCBASE=''P'' THEN FF.VALOR ELSE FF.VALOR * (-1) END ''VALOR''
    FROM PFUNC FU (NOLOCK)
    INNER JOIN PFFINANC FF (NOLOCK) ON FF.CODCOLIGADA=FU.CODCOLIGADA AND FF.CHAPA=FU.CHAPA 
    INNER JOIN PEVENTO EV (NOLOCK) ON EV.CODCOLIGADA=FF.CODCOLIGADA AND EV.CODIGO=FF.CODEVENTO
    INNER JOIN PSECAO SE (NOLOCK) ON SE.CODCOLIGADA=FU.CODCOLIGADA AND SE.CODIGO=FU.CODSECAO
    INNER JOIN PFUNCAO FC (NOLOCK) ON FC.CODCOLIGADA=FU.CODCOLIGADA AND FC.CODIGO=FU.CODFUNCAO
    LEFT OUTER JOIN PFPERFF FP (NOLOCK) ON FP.CODCOLIGADA = FF.CODCOLIGADA AND FP.ANOCOMP = FF.ANOCOMP AND FP.MESCOMP = FF.MESCOMP AND FP.CHAPA = FF.CHAPA AND FP.NROPERIODO = FF.NROPERIODO
    LEFT OUTER JOIN GCOLIGADA GC ON GC.CODCOLIGADA = FU.CODCOLIGADA

    LEFT OUTER JOIN GFILIAL GF ON GF.CODCOLIGADA = SE.CODCOLIGADA AND GF.CODFILIAL = SE.CODFILIAL
    LEFT OUTER JOIN PSINDIC SI ON SI.CODCOLIGADA = FU.CODCOLIGADA AND SI.CODIGO = FU.CODSINDICATO
    WHERE FF.VALOR<>0
      AND EV.PROVDESCBASE<> ''B'' AND FF.ANOCOMP =@PLN_Sheet1_$B$2 AND FF.MESCOMP =@PLN_Sheet1_$B$3
    )RESULT1
    PIVOT
    (AVG(VALOR) FOR EVENTO IN (' + @COLUNAS_PIVOT + ') ) AS PIVOTTABLE
    ) VALUES (SELECT 
    *
    FROM (
    SELECT
    FF.ANOCOMP AS ANO,
    FF.MESCOMP AS MES,
    GC.NOME AS EMPRESA,
    GF.NOME AS FILIAL,
    FU.CHAPA,
    FU.NOME,
    CONVERT(VARCHAR(10), FU.DATAADMISSAO, 103) as DATA_ADMISSAO,
    CASE FU.CODSITUACAO WHEN ''A'' THEN ''Ativo'' WHEN ''D'' THEN ''Demitido'' WHEN ''E'' THEN ''Licença_Maternidade'' WHEN ''F'' THEN ''Férias'' WHEN ''I'' THEN ''Aposentado_Invalidez'' WHEN ''P'' THEN ''Afastado_Previdência'' WHEN ''T'' THEN ''Afastado_Acidente_Trabalho'' WHEN ''L'' THEN ''Licença_s/_Venc'' WHEN ''C'' THEN ''Contrato_de_Trabalho_Suspenso'' WHEN ''U'' THEN ''Outros'' ELSE ''Não'' END SITUACAO,
    CASE FU.CODTIPO WHEN ''A'' THEN ''Autônomo'' WHEN ''B'' THEN ''Temporário_com_redução_de_encargos'' WHEN ''C'' THEN ''Conselheiro'' WHEN ''D'' THEN ''Diretor'' WHEN ''E'' THEN ''Estatutário'' WHEN ''F'' THEN ''Temporário/Comissionista'' WHEN ''I'' THEN ''Cedido'' WHEN ''M'' THEN ''Misto'' WHEN ''N'' THEN ''Normal'' WHEN ''O'' THEN ''Comissionista'' WHEN ''P'' THEN ''Temporário'' WHEN ''R'' THEN ''Rural'' WHEN ''S'' THEN ''Pensionista'' WHEN ''T'' THEN ''Estagiário'' WHEN ''U'' THEN ''Outros'' WHEN ''V'' THEN ''Contrato_Verde/Amarelo'' WHEN ''X'' THEN ''Expatriado'' WHEN ''Z'' THEN ''Aprendiz'' ELSE ''N'' END VINCULO,
    CONVERT(VARCHAR(10), FU.DATADEMISSAO, 103) as DATA_RESCISAO,
    SI.NOME AS SINDICATO,
    SE.CODIGO AS CODIGO_DE_ESTRUTURA,
    SE.DESCRICAO AS CENTRO_DE_CUSTO,
    CAST ((FF.CODEVENTO+EV.DESCRICAO) AS VARCHAR) EVENTO,
    CASE WHEN EV.PROVDESCBASE=''P'' THEN FF.VALOR ELSE FF.VALOR * (-1) END ''VALOR''
    FROM PFUNC FU (NOLOCK)
    INNER JOIN PFFINANC FF (NOLOCK) ON FF.CODCOLIGADA=FU.CODCOLIGADA AND FF.CHAPA=FU.CHAPA 
    INNER JOIN PEVENTO EV (NOLOCK) ON EV.CODCOLIGADA=FF.CODCOLIGADA AND EV.CODIGO=FF.CODEVENTO
    INNER JOIN PSECAO SE (NOLOCK) ON SE.CODCOLIGADA=FU.CODCOLIGADA AND SE.CODIGO=FU.CODSECAO
    INNER JOIN PFUNCAO FC (NOLOCK) ON FC.CODCOLIGADA=FU.CODCOLIGADA AND FC.CODIGO=FU.CODFUNCAO
    LEFT OUTER JOIN PFPERFF FP (NOLOCK) ON FP.CODCOLIGADA = FF.CODCOLIGADA AND FP.ANOCOMP = FF.ANOCOMP AND FP.MESCOMP = FF.MESCOMP AND FP.CHAPA = FF.CHAPA AND FP.NROPERIODO = FF.NROPERIODO
    LEFT OUTER JOIN GCOLIGADA GC ON GC.CODCOLIGADA = FU.CODCOLIGADA

    LEFT OUTER JOIN GFILIAL GF ON GF.CODCOLIGADA = SE.CODCOLIGADA AND GF.CODFILIAL = SE.CODFILIAL
    LEFT OUTER JOIN PSINDIC SI ON SI.CODCOLIGADA = FU.CODCOLIGADA AND SI.CODIGO = FU.CODSINDICATO
    WHERE FF.VALOR<>0
      AND EV.PROVDESCBASE<> ''B'' AND FF.ANOCOMP =@PLN_Sheet1_$B$2 AND FF.MESCOMP =@PLN_Sheet1_$B$3
    )RESULT1
    PIVOT
    (AVG(VALOR) FOR EVENTO IN (' + @COLUNAS_PIVOT + ') ) AS PIVOTTABLE
    )'
    PRINT @COMANDO_SQL
    execute sp_executesql 
        @COMANDO_SQL, 
        N'@PLN_Sheet1_$B$2 NUMERIC(4), @PLN_Sheet1_$B$3 NUMERIC(2)', 
        @PLN_Sheet1_$B$2 = @PLN_Sheet1_$B$2, @PLN_Sheet1_$B$3 = @PLN_Sheet1_$B$3

    sexta-feira, 22 de janeiro de 2021 23:33
  • Pensei na possibilidade de dropar a tabela no inicio, e sempre criar uma nova tabela, com as informações dinâmicas conforme a consulta, dentro da própria SP. Mas não sei como posso fazer isso.

    FernandesO,

    É uma alternativa, mas ao meu ver longa e trabalhosa, particularmente em pensaria no uso de uma tabela única, mas com colunas que possam receber diversos tipos de dados.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 25 de janeiro de 2021 12:10
  • FernandesO,

    Você chegou a testar a sugestão do Dev091980?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 25 de janeiro de 2021 12:11
  • Encontrei outra maneira de fazer isso, e na verdade acho que a única. 

    Criar uma tabela sempre que rodar a SP. Deu certo, porém, meu único problema foi declarar o tipo de dados nas colunas variáveis @COLUNAS_PIVOT. Para isso ainda não consegui ter uma ideia de como posso fazer. 

    Coloquei em negrito e sublinhado onde não estou conseguindo declarar o tipo de dados. Se tiverem alguma ideia eu agradeço.

    Segue a alteração:

    CREATE PROCEDURE EventosFolha
    @PLN_Sheet1_$B$2 NUMERIC (4),
    @PLN_Sheet1_$B$3 NUMERIC (2)

    AS

    DECLARE 
    @COLUNAS_PIVOT AS NVARCHAR(MAX), 
    @COMANDO_SQL AS NVARCHAR(MAX),
    @CREATE_TABLE AS NVARCHAR(MAX)

    SET @COLUNAS_PIVOT =
    STUFF((
    SELECT DISTINCT cast (',' + QUOTENAME(OP.CODIGO+'-'+OP.DESCRICAO) AS VARCHAR(max)) FROM PFFINANC CP (NOLOCK) INNER JOIN PEVENTO OP (NOLOCK) ON OP.CODCOLIGADA=CP.CODCOLIGADA AND OP.CODIGO=CP.CODEVENTO
    WHERE CP.VALOR<>0 AND OP.PROVDESCBASE<>'B' AND CP.ANOCOMP =@PLN_Sheet1_$B$2 AND CP.MESCOMP =@PLN_Sheet1_$B$3
    FOR XML PATH('')
    ), 1, 1, '')
    PRINT @COLUNAS_PIVOT

    IF object_id('tempdb..#EVENTOS_TEMP') is not null
    BEGIN
    DROP TABLE #EVENTOS_TEMP
    END
    IF @COLUNAS_PIVOT <> ''
    BEGIN
    EXECUTE ('CREATE  TABLE  #EVENTOS_TEMP (
    ANO INTEGER NOT NULL,
    MES INTEGER NOT NULL,
    EMPRESA VARCHAR (MAX) NULL,
    FILIAL VARCHAR (MAX) NULL,
    CHAPA VARCHAR (MAX) NOT NULL,
    NOME VARCHAR (MAX) NOT NULL,
    DATA_ADMISSAO DATE NULL,
    SITUACAO VARCHAR (MAX) NOT NULL,
    VINCULO VARCHAR (MAX) NOT NULL,
    DATA_RESCISAO DATE NULL,
    SINDICATO VARCHAR(MAX) NULL,
    CODIGO_DE_ESTRUTURA VARCHAR(MAX) NULL,
    CENTRO_DE_CUSTO VARCHAR(MAX) NULL,'
    + @COLUNAS_PIVOT +')'
    )
    END

    SET @COMANDO_SQL = 'INSERT #EVENTOS_TEMP 
    SELECT 
    *
    FROM (
    SELECT
    FF.ANOCOMP AS ANO,
    FF.MESCOMP AS MES,
    GC.NOME AS EMPRESA,
    GF.NOME AS FILIAL,
    FU.CHAPA,
    FU.NOME,
    CONVERT(VARCHAR(10), FU.DATAADMISSAO, 103) as DATA_ADMISSAO,
    CASE FU.CODSITUACAO WHEN ''A'' THEN ''Ativo'' WHEN ''D'' THEN ''Demitido'' WHEN ''E'' THEN ''Licença_Maternidade'' WHEN ''F'' THEN ''Férias'' WHEN ''I'' THEN ''Aposentado_Invalidez'' WHEN ''P'' THEN ''Afastado_Previdência'' WHEN ''T'' THEN ''Afastado_Acidente_Trabalho'' WHEN ''L'' THEN ''Licença_s/_Venc'' WHEN ''C'' THEN ''Contrato_de_Trabalho_Suspenso'' WHEN ''U'' THEN ''Outros'' ELSE ''Não'' END SITUACAO,
    CASE FU.CODTIPO WHEN ''A'' THEN ''Autônomo'' WHEN ''B'' THEN ''Temporário_com_redução_de_encargos'' WHEN ''C'' THEN ''Conselheiro'' WHEN ''D'' THEN ''Diretor'' WHEN ''E'' THEN ''Estatutário'' WHEN ''F'' THEN ''Temporário/Comissionista'' WHEN ''I'' THEN ''Cedido'' WHEN ''M'' THEN ''Misto'' WHEN ''N'' THEN ''Normal'' WHEN ''O'' THEN ''Comissionista'' WHEN ''P'' THEN ''Temporário'' WHEN ''R'' THEN ''Rural'' WHEN ''S'' THEN ''Pensionista'' WHEN ''T'' THEN ''Estagiário'' WHEN ''U'' THEN ''Outros'' WHEN ''V'' THEN ''Contrato_Verde/Amarelo'' WHEN ''X'' THEN ''Expatriado'' WHEN ''Z'' THEN ''Aprendiz'' ELSE ''N'' END VINCULO,
    CONVERT(VARCHAR(10), FU.DATADEMISSAO, 103) as DATA_RESCISAO,
    SI.NOME AS SINDICATO,
    SE.CODIGO AS CODIGO_DE_ESTRUTURA,
    SE.DESCRICAO AS CENTRO_DE_CUSTO,
    CAST ((FF.CODEVENTO+EV.DESCRICAO) AS VARCHAR) EVENTO,
    CASE WHEN EV.PROVDESCBASE=''P'' THEN FF.VALOR ELSE FF.VALOR * (-1) END ''VALOR''
    FROM PFUNC FU (NOLOCK)
    INNER JOIN PFFINANC FF (NOLOCK) ON FF.CODCOLIGADA=FU.CODCOLIGADA AND FF.CHAPA=FU.CHAPA 
    INNER JOIN PEVENTO EV (NOLOCK) ON EV.CODCOLIGADA=FF.CODCOLIGADA AND EV.CODIGO=FF.CODEVENTO
    INNER JOIN PSECAO SE (NOLOCK) ON SE.CODCOLIGADA=FU.CODCOLIGADA AND SE.CODIGO=FU.CODSECAO
    INNER JOIN PFUNCAO FC (NOLOCK) ON FC.CODCOLIGADA=FU.CODCOLIGADA AND FC.CODIGO=FU.CODFUNCAO
    LEFT OUTER JOIN PFPERFF FP (NOLOCK) ON FP.CODCOLIGADA = FF.CODCOLIGADA AND FP.ANOCOMP = FF.ANOCOMP AND FP.MESCOMP = FF.MESCOMP AND FP.CHAPA = FF.CHAPA AND FP.NROPERIODO = FF.NROPERIODO
    LEFT OUTER JOIN GCOLIGADA GC ON GC.CODCOLIGADA = FU.CODCOLIGADA
    LEFT OUTER JOIN GFILIAL GF ON GF.CODCOLIGADA = SE.CODCOLIGADA AND GF.CODFILIAL = SE.CODFILIAL
    LEFT OUTER JOIN PSINDIC SI ON SI.CODCOLIGADA = FU.CODCOLIGADA AND SI.CODIGO = FU.CODSINDICATO
    WHERE FF.VALOR<>0
      AND EV.PROVDESCBASE<> ''B'' AND FF.ANOCOMP =@PLN_Sheet1_$B$2 AND FF.MESCOMP =@PLN_Sheet1_$B$3
    )RESULT1
    PIVOT
    (AVG(VALOR) FOR EVENTO IN (' + @COLUNAS_PIVOT + ') ) AS PIVOTTABLE
    ORDER BY 1'
    PRINT @COMANDO_SQL

    execute sp_executesql 
        @COMANDO_SQL, 
        N'@PLN_Sheet1_$B$2 NUMERIC(4), @PLN_Sheet1_$B$3 NUMERIC(2)', 
        @PLN_Sheet1_$B$2 = @PLN_Sheet1_$B$2, @PLN_Sheet1_$B$3 = @PLN_Sheet1_$B$3

    terça-feira, 26 de janeiro de 2021 14:00
  • Dev, eu optei por criar uma tabela toda vez que executar o SP. Mas estou tendo erro no momento de declarar o tipo de dados das colunas PIVOT dinamico.

    Consegue me auxiliar.

    CREATE PROCEDURE EventosFolha
    @PLN_Sheet1_$B$2 NUMERIC (4),
    @PLN_Sheet1_$B$3 NUMERIC (2)

    AS

    DECLARE 
    @COLUNAS_PIVOT AS NVARCHAR(MAX), 
    @COMANDO_SQL AS NVARCHAR(MAX),
    @CREATE_TABLE AS NVARCHAR(MAX)

    SET @COLUNAS_PIVOT =
    STUFF((
    SELECT DISTINCT cast (',' + QUOTENAME(OP.CODIGO+'-'+OP.DESCRICAO) AS VARCHAR(max)) FROM PFFINANC CP (NOLOCK) INNER JOIN PEVENTO OP (NOLOCK) ON OP.CODCOLIGADA=CP.CODCOLIGADA AND OP.CODIGO=CP.CODEVENTO
    WHERE CP.VALOR<>0 AND OP.PROVDESCBASE<>'B' AND CP.ANOCOMP =@PLN_Sheet1_$B$2 AND CP.MESCOMP =@PLN_Sheet1_$B$3
    FOR XML PATH('')
    ), 1, 1, '')
    PRINT @COLUNAS_PIVOT

    IF object_id('tempdb..#EVENTOS_TEMP') is not null
    BEGIN
    DROP TABLE #EVENTOS_TEMP
    END
    IF @COLUNAS_PIVOT <> ''
    BEGIN
    EXECUTE ('CREATE  TABLE  #EVENTOS_TEMP (
    ANO INTEGER NOT NULL,
    MES INTEGER NOT NULL,
    EMPRESA VARCHAR (MAX) NULL,
    FILIAL VARCHAR (MAX) NULL,
    CHAPA VARCHAR (MAX) NOT NULL,
    NOME VARCHAR (MAX) NOT NULL,
    DATA_ADMISSAO DATE NULL,
    SITUACAO VARCHAR (MAX) NOT NULL,
    VINCULO VARCHAR (MAX) NOT NULL,
    DATA_RESCISAO DATE NULL,
    SINDICATO VARCHAR(MAX) NULL,
    CODIGO_DE_ESTRUTURA VARCHAR(MAX) NULL,
    CENTRO_DE_CUSTO VARCHAR(MAX) NULL,'
    + @COLUNAS_PIVOT +')'
    )
    END

    SET @COMANDO_SQL = 'INSERT #EVENTOS_TEMP 
    SELECT 
    *
    FROM (
    SELECT
    FF.ANOCOMP AS ANO,
    FF.MESCOMP AS MES,
    GC.NOME AS EMPRESA,
    GF.NOME AS FILIAL,
    FU.CHAPA,
    FU.NOME,
    CONVERT(VARCHAR(10), FU.DATAADMISSAO, 103) as DATA_ADMISSAO,
    CASE FU.CODSITUACAO WHEN ''A'' THEN ''Ativo'' WHEN ''D'' THEN ''Demitido'' WHEN ''E'' THEN ''Licença_Maternidade'' WHEN ''F'' THEN ''Férias'' WHEN ''I'' THEN ''Aposentado_Invalidez'' WHEN ''P'' THEN ''Afastado_Previdência'' WHEN ''T'' THEN ''Afastado_Acidente_Trabalho'' WHEN ''L'' THEN ''Licença_s/_Venc'' WHEN ''C'' THEN ''Contrato_de_Trabalho_Suspenso'' WHEN ''U'' THEN ''Outros'' ELSE ''Não'' END SITUACAO,
    CASE FU.CODTIPO WHEN ''A'' THEN ''Autônomo'' WHEN ''B'' THEN ''Temporário_com_redução_de_encargos'' WHEN ''C'' THEN ''Conselheiro'' WHEN ''D'' THEN ''Diretor'' WHEN ''E'' THEN ''Estatutário'' WHEN ''F'' THEN ''Temporário/Comissionista'' WHEN ''I'' THEN ''Cedido'' WHEN ''M'' THEN ''Misto'' WHEN ''N'' THEN ''Normal'' WHEN ''O'' THEN ''Comissionista'' WHEN ''P'' THEN ''Temporário'' WHEN ''R'' THEN ''Rural'' WHEN ''S'' THEN ''Pensionista'' WHEN ''T'' THEN ''Estagiário'' WHEN ''U'' THEN ''Outros'' WHEN ''V'' THEN ''Contrato_Verde/Amarelo'' WHEN ''X'' THEN ''Expatriado'' WHEN ''Z'' THEN ''Aprendiz'' ELSE ''N'' END VINCULO,
    CONVERT(VARCHAR(10), FU.DATADEMISSAO, 103) as DATA_RESCISAO,
    SI.NOME AS SINDICATO,
    SE.CODIGO AS CODIGO_DE_ESTRUTURA,
    SE.DESCRICAO AS CENTRO_DE_CUSTO,
    CAST ((FF.CODEVENTO+EV.DESCRICAO) AS VARCHAR) EVENTO,
    CASE WHEN EV.PROVDESCBASE=''P'' THEN FF.VALOR ELSE FF.VALOR * (-1) END ''VALOR''
    FROM PFUNC FU (NOLOCK)
    INNER JOIN PFFINANC FF (NOLOCK) ON FF.CODCOLIGADA=FU.CODCOLIGADA AND FF.CHAPA=FU.CHAPA 
    INNER JOIN PEVENTO EV (NOLOCK) ON EV.CODCOLIGADA=FF.CODCOLIGADA AND EV.CODIGO=FF.CODEVENTO
    INNER JOIN PSECAO SE (NOLOCK) ON SE.CODCOLIGADA=FU.CODCOLIGADA AND SE.CODIGO=FU.CODSECAO
    INNER JOIN PFUNCAO FC (NOLOCK) ON FC.CODCOLIGADA=FU.CODCOLIGADA AND FC.CODIGO=FU.CODFUNCAO
    LEFT OUTER JOIN PFPERFF FP (NOLOCK) ON FP.CODCOLIGADA = FF.CODCOLIGADA AND FP.ANOCOMP = FF.ANOCOMP AND FP.MESCOMP = FF.MESCOMP AND FP.CHAPA = FF.CHAPA AND FP.NROPERIODO = FF.NROPERIODO
    LEFT OUTER JOIN GCOLIGADA GC ON GC.CODCOLIGADA = FU.CODCOLIGADA
    LEFT OUTER JOIN GFILIAL GF ON GF.CODCOLIGADA = SE.CODCOLIGADA AND GF.CODFILIAL = SE.CODFILIAL
    LEFT OUTER JOIN PSINDIC SI ON SI.CODCOLIGADA = FU.CODCOLIGADA AND SI.CODIGO = FU.CODSINDICATO
    WHERE FF.VALOR<>0
      AND EV.PROVDESCBASE<> ''B'' AND FF.ANOCOMP =@PLN_Sheet1_$B$2 AND FF.MESCOMP =@PLN_Sheet1_$B$3
    )RESULT1
    PIVOT
    (AVG(VALOR) FOR EVENTO IN (' + @COLUNAS_PIVOT + ') ) AS PIVOTTABLE
    ORDER BY 1'
    PRINT @COMANDO_SQL

    execute sp_executesql 
        @COMANDO_SQL, 
        N'@PLN_Sheet1_$B$2 NUMERIC(4), @PLN_Sheet1_$B$3 NUMERIC(2)', 
        @PLN_Sheet1_$B$2 = @PLN_Sheet1_$B$2, @PLN_Sheet1_$B$3 = @PLN_Sheet1_$B$3

    terça-feira, 26 de janeiro de 2021 14:04
  • FernandesO,

    O erro é o mesmo? Em linha da sua Stored Procedure esta sendo apresentada o erro?

    Podemos pensar na implementação dentro do código fonte da sua SP das funções de Validação e Captura de Erros em conjunto com o bloco Begin Try ... Begin Catch.

    Vou compartilhar alguns posts do meu blog, os quais contem exemplos e scripts que podem lhe ajudar:

    Material de Apoio – Junho 2019 – Junior Galvão – MVP – Data Platform (wordpress.com)

    Short Scripts – Julho – 2014 – Junior Galvão – MVP – Data Platform (wordpress.com)

    Usando TRY…CATCH na Transact-SQL – Parte II – Junior Galvão – MVP – Data Platform (wordpress.com)

    Usando TRY…CATCH na Transact-SQL – Parte I – Junior Galvão – MVP – Data Platform (wordpress.com)

    Usando TRY…CATCH no Transact-SQL – Final – Junior Galvão – MVP – Data Platform (wordpress.com)

    Usando TRY…CATCH no Transact-SQL – Parte IV – Junior Galvão – MVP – Data Platform (wordpress.com)


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 27 de janeiro de 2021 14:11
  • O erro está sendo esse Junior,

    A definição da coluna '0002-DIAS TRABALHADOS' deve incluir um tipo de dados.

    Essa coluna "0002-DIAS TRABALHADOS" é a primeira coluna do PIVOT Dinâmico. Não está deixando criar a tabela por falta de informar o tipo de dados das colunas do PIVOT.

    Att,

    Emerson

    quinta-feira, 28 de janeiro de 2021 12:04
  • FernandesO,

    Então caro colega, olha o trabalho para ficar definindo o tipo de dados, sei que acaba sendo mais robusto e inteligente definir o dado correto, mas como você esta trabalhando de forma dinâmica, porque não estabelecer um tipo de dados mais prático.

    Mas mesmo assim, seguindo a sua necessidade, verifiquei que na sua declaração da tabela Evento_Temp, esta declarando o tipo de dados INTEGER, sendo que o no SQL Server não se utiliza esta definição e sim INT.

    Faça esta alteração.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 28 de janeiro de 2021 12:18
  • Boa tarde Junior, como vai ?

    Então, se houver uma forma mais fácil de desenvolver esse trabalho, eu aceito a sugestão. Pois, essa foi a maneira mais trabalhosa, porém, que me entrega o que preciso. Referente a definição do tipo de dados, eu gostaria de saber se há como definir o tipo VARCHAR(MAX) para todas as colunas dinâmicas que trouxe no resultado.

    Quanto ao dados INT, obrigado, vou fazer essa alteração, não tinha me atentado a isso.

    Obrigado pelo apoio Junior, isso realmente está me tirando o sono.

    Att,

    Emerson Fernandes

    quinta-feira, 28 de janeiro de 2021 15:40
  • FernandesO,

    Eu que agradeço, então como venho destacando:

    1 - Deixe uma tabela criada, com a quantidade de colunas que você imagina que seu Pivot vai no máximo trazer de colunas,

    2 - Realize os Inserts deste Pivot justamente nesta tabela ponte,

    3 - Sempre antes de inserir os dados faça o Truncate,

    4 - Insira,

    5 - Realize os procedimentos de ajustes e limpeza dos dados, e

    6 - Depois repasse para tabela correta.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 28 de janeiro de 2021 17:43
  • O problema Junior, é que não tenho como deixar uma tabela fixa criada. Por que o usuário pode criar outro cadastro, adicionando uma nova coluna que não existirá na tabela criada. Dessa forma vai dar dor de cabeça. Entendeu ?

    quinta-feira, 28 de janeiro de 2021 21:01
  • FernandesO,

    Ok, eu entendi sim.... Mas eu sempre estou falando em uma tabela com uma grande quantidade de colunas justamente para tentar armazenar tudo o que for possível.

    Se existe esta flexibilidade para o usuário então o cenário vai ficar mais complicado ainda, existe um limite de colunas que ele pode criar?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 29 de janeiro de 2021 11:41