none
Como fazer select com insert em coluna com tipo timestamp RRS feed

  • Pergunta

  • Pessoal

        Como devo proceder para fazer o seguinte select com insert, onde existe coluna com o tipo timestamp, onde está dando o seguinte erro abaixo no momento.

    [dt_InsertTime] [timestamp] NOT NULL,
    
    
    INSERT INTO [dbo].[tb_acesso_mensal]
               ([id_Usuario]
               ,[id_Empresa]
               ,[dt_Acesso_Portaria]
               ,[id_Unidade]
               ,[dt_Saida]
    		   ,[dt_InsertTime]
               ,[ic_Reprocesso])
    SELECT [id_Usuario]
          ,[id_Empresa]
          ,[dt_Acesso_Portaria]
          ,[id_Unidade]
          ,[dt_Saida]
          ,[dt_InsertTime]
          ,[ic_Reprocesso]
      FROM [dbo].[tb_acesso_diario] (nolock)
    where dt_Acesso_Portaria between convert(datetime,'2019/07/01 00:00:00',111) and convert(datetime,'2019/07/01 23:59:59',111) 
    
    
    /*
    Msg 273, Level 16, State 1, Line 5
    Cannot insert an explicit value into a timestamp column. Use INSERT with a column list to exclude the timestamp column, or insert a DEFAULT into the timestamp column.
    */
    
    

    • Movido José Diz quarta-feira, 3 de julho de 2019 19:59
    quarta-feira, 3 de julho de 2019 19:43

Respostas

  • no meu caso, gostaria de automatizar e vi que em outros site o pessoal faz uma conversão deste campo, só que os testes que fiz não deu certo.

    Se o objetivo é agrupar informações diárias de outras fontes em uma mensal, então sugiro que declare a coluna [dt_InsertTime] da tabela [tb_acesso_mensal] como binary(8). Dessa forma a informação original será mantida.

    O código de transferência fica então assim:

    -- código #1
    declare @DataInicial datetime, @DataFinal datetime;
    set @DataInicial= convert (datetime, '1/7/2019');  -- dd/mm/aaaa
    set @DataFinal= convert (datetime, '1/7/2019');  -- dd/mm/aaaa
    
    -- ajuste data final
    set @DataFinal= dateadd (day, +1, @DataFinal);
    
    --
    INSERT into dbo.tb_acesso_mensal
               (id_Usuario, id_Empresa, dt_Acesso_Portaria, id_Unidade, dt_Saida, dt_InsertTime, ic_Reprocesso)
       SELECT id_Usuario, id_Empresa, dt_Acesso_Portaria, id_Unidade, dt_Saida, 
              cast (dt_InsertTime as binary(8)), ic_Reprocesso
         from dbo.tb_acesso_diario 
         where dt_Acesso_Portaria >= @DataInicial
               and dt_Acesso_Portaria < @DataFinal;

    Não testei; pode conter erro(s).

    ---

    Demo da solução:

    -- código #3
    USE tempDB;

    CREATE TABLE Dia (Data date, X timestamp, I int identity);
    INSERT into Dia (Data) values ('20010101');
    INSERT into Dia (Data) values ('20010102');
    SELECT * from Dia;

    CREATE TABLE Mês (Data date, X binary(8), I int);
    INSERT into Mês (Data, X, I)
       SELECT Data, cast (X as binary(8)), I
         from Dia;
    SELECT * from Mês;

    Observe que a coluna X (declarada como binary) da tabela Mês mantém corretamente o valor da coluna X (declarada como timestamp). 

     


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Marcado como Resposta neibala segunda-feira, 22 de julho de 2019 19:43
    • Editado José Diz terça-feira, 23 de julho de 2019 20:17
    sexta-feira, 19 de julho de 2019 09:42

Todas as Respostas

  • Msg 273, Level 16, State 1, Line 5
    Cannot insert an explicit value into a timestamp column. Use INSERT with a column list to exclude the timestamp column, or insert a DEFAULT into the timestamp column.

    "neibala", colunas com o tipo de dados TIMESTAMP, atualmente denominado de ROWVERSION, não permitem assinalar valor; quem faz isso é o próprio SQL Server.

    TIMESTAMP não contém data mas sim um contador incremental; é um valor puramente numérico, equivalente a BINARY(8).

    ---

    Pela mensagem de erro, na tabela tb_acesso_mensal a coluna dt_InsertTime está declarada como timestamp; e como está declarada a coluna dt_InsertTime na tabela tb_acesso_diario?

    Qual é o objetivo de ter a coluna dt_InsertTime na tabela tb_acesso_diario?

     

    Se esta resposta ajudou a resolver seu problema, lembre-se de marcá-la.


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.
    • Editado José Diz sexta-feira, 19 de julho de 2019 09:27
    quarta-feira, 3 de julho de 2019 19:58
  • Neibala,

    Além destas observações, se realmente você tem a necessidade de inserir valores que podem representar rótulos de tempo mas precisam ser informados ou manipulados via sistema, provavelmente o TimeStamp não venha a ser uma solução interessante.

    Será que uma temporal table não poderia te ajudar?

    Ou também, trabalhar com outro tipo de dados como por exemplo um DateTime2, que lhe permitirá ter todo controle de ordem cronológica dos dados ao longo do tempo.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | 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, 3 de julho de 2019 23:16
  • Pessoal

        É que o meu problema, ocorre da seguinte maneira, na 1o. inserção dos dados o campo deve ser desta maneira mesmo, já definido por outro Sistema que atende plenamente eles, já para a minha rotina seria uma contingência, onde preciso mover de um Servidor para outro, onde o outro Servidor acabou não tem este movimento que acabou dando problema, onde percebi que pelo Management Studio, na parte de gerar os dados ele gera a informação corretamente só que no meu caso, gostaria de automatizar e vi que em outros site o pessoal faz uma conversão deste campo, só que os testes que fiz não deu certo.

    quinta-feira, 18 de julho de 2019 12:50
  • Neibala,

    Acabou ficando um pouco confuso o post anterior.

    Uma pergunta, o que você deseja mover? São estes dados armazenados no primeiro servidor, ou a aplicação começar a registrar também na contingência estes movimentos?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | 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, 18 de julho de 2019 14:13
  • no meu caso, gostaria de automatizar e vi que em outros site o pessoal faz uma conversão deste campo, só que os testes que fiz não deu certo.

    Se o objetivo é agrupar informações diárias de outras fontes em uma mensal, então sugiro que declare a coluna [dt_InsertTime] da tabela [tb_acesso_mensal] como binary(8). Dessa forma a informação original será mantida.

    O código de transferência fica então assim:

    -- código #1
    declare @DataInicial datetime, @DataFinal datetime;
    set @DataInicial= convert (datetime, '1/7/2019');  -- dd/mm/aaaa
    set @DataFinal= convert (datetime, '1/7/2019');  -- dd/mm/aaaa
    
    -- ajuste data final
    set @DataFinal= dateadd (day, +1, @DataFinal);
    
    --
    INSERT into dbo.tb_acesso_mensal
               (id_Usuario, id_Empresa, dt_Acesso_Portaria, id_Unidade, dt_Saida, dt_InsertTime, ic_Reprocesso)
       SELECT id_Usuario, id_Empresa, dt_Acesso_Portaria, id_Unidade, dt_Saida, 
              cast (dt_InsertTime as binary(8)), ic_Reprocesso
         from dbo.tb_acesso_diario 
         where dt_Acesso_Portaria >= @DataInicial
               and dt_Acesso_Portaria < @DataFinal;

    Não testei; pode conter erro(s).

    ---

    Demo da solução:

    -- código #3
    USE tempDB;

    CREATE TABLE Dia (Data date, X timestamp, I int identity);
    INSERT into Dia (Data) values ('20010101');
    INSERT into Dia (Data) values ('20010102');
    SELECT * from Dia;

    CREATE TABLE Mês (Data date, X binary(8), I int);
    INSERT into Mês (Data, X, I)
       SELECT Data, cast (X as binary(8)), I
         from Dia;
    SELECT * from Mês;

    Observe que a coluna X (declarada como binary) da tabela Mês mantém corretamente o valor da coluna X (declarada como timestamp). 

     


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Marcado como Resposta neibala segunda-feira, 22 de julho de 2019 19:43
    • Editado José Diz terça-feira, 23 de julho de 2019 20:17
    sexta-feira, 19 de julho de 2019 09:42
  • José Diz

          Acredito que o caminho seria isto mesmo na questão de conversão, vou testar e depois dou um retorno.

     

    sexta-feira, 19 de julho de 2019 11:51
  • Neibala,

    Na questão de conversão, você destacou que este pode ser o caminho, mas em relação a movimentação dos dados, você poderia nos orientar.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | 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, 19 de julho de 2019 15:49
  • Junior Galvão

          É que este processo seria um caso de contingência que quando as informações não constar em outro Servidor, tenho que ativar uma rotina e  nesta rotina que estou desenvolvimento até o momento, por ter na tabela este campo com o tipo timestamp, tenho que atualizar no novo Servidor essas informações no mesmo padrão que está no Servidor de origem, por isto a conversão seria um bom caminho, pois tentei algumas mais não deu certo.

         E eu tendo está rotina eu conseguiria utilizar até mesmo, para a geração de dados para as áreas de DW-BI da empresa, isto tudo no mesmo padrão.

         Como comente que pelo Management Studio ele fazer isto, pois se eu mandar gerar a tabela com os dados para outro Servidor eu percebi que ele consegue demonstrar claramente a informação deste campo timestamp, através do script de insert que ele gera, por isto se conseguisse fazer está conversão para a informação padrão e original me ajudaria em muito nos meus processos.


    • Editado neibala sábado, 20 de julho de 2019 00:36 erro de digitação
    sábado, 20 de julho de 2019 00:33
  • Junior Galvão

          É que este processo seria um caso de contingência que quando as informações não constar em outro Servidor, tenho que ativar uma rotina e  nesta rotina que estou desenvolvimento até o momento, por ter na tabela este campo com o tipo timestamp, tenho que atualizar no novo Servidor essas informações no mesmo padrão que está no Servidor de origem, por isto a conversão seria um bom caminho, pois tentei algumas mais não deu certo.

         E eu tendo está rotina eu conseguiria utilizar até mesmo, para a geração de dados para as áreas de DW-BI da empresa, isto tudo no mesmo padrão.

         Como comente que pelo Management Studio ele fazer isto, pois se eu mandar gerar a tabela com os dados para outro Servidor eu percebi que ele consegue demonstrar claramente a informação deste campo timestamp, através do script de insert que ele gera, por isto se conseguisse fazer está conversão para a informação padrão e original me ajudaria em muito nos meus processos.


    Neibala,

    Ok, entendo, veja então conforme a sua necessidade no que poderemos ajudar.


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

    sábado, 20 de julho de 2019 13:39