none
Erro Importação SQL SERVER 2012 RRS feed

  • Pergunta

  • Olá, boa tarde.

    Estou com erro para importa dados de banco para outro.

    Alguma dica como resolve? 

    Como faço para desabilitar chave primária e depois habilitar ?

    domingo, 26 de janeiro de 2020 16:41

Respostas

  • Rubem,

    Obrigado pelo retorno, a mensagem de erro apresentada deixa bem claro:

    ""Cannot insert duplicate key row in object 'dbo.ELE_TENANT' with unique index 'CNT_ELE_TENANT_UNQ_ID_fluig1'. The duplicate key value is (<NULL>)."."

    Você esta tentando inserir valores na tabela Ele_Tenant que a coluna ID_fluig1 contem o index unique index 'CNT_ELE_TENANT_UNQ_ID_fluig1. Não é permitido inserir valores duplicados neste coluna ou valores nulos.

    ------------------------------------------------

    Pelo que entendi estes bancos de dados estão no mesmo Servidor.

    - Se realmente for esse o cenário, uma alternativa ao meu ver mais fácil, seria ao invês de utilizar a ferramenta Import/Export Data, proceder a execução de um Insert...Select, fazendo o Insert de dados na tabela existente no banco de dados B, sendo estes coletados via Select no banco de Dados A.

    Veja o exemplo:

    -- Inserindo os dados --
    Insert Into BancoDeDadosB.dbo.TabelaDestino (Coluna1, Coluna2,......)
    Select Coluna1, Coluna2,....... From BancoDeDadosA.dbo.TabelaOrigem
    Go

    Se for o caso, antes de realizar este procedimento verifique se é necessário excluir os dados atuais na tabela existente no banco de dados B.

    Vale também ressaltar que tanto no Insert como no Select você pode especificar as tabelas que deseja utilizar.

    Em adicional, você pode montar toda lógica necessária ao seu comando Select, utilizando filtros, ordenações e agrupamentos o que vai resultar nos dados que deverão ser repassados para o comando Insert.


    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]


    segunda-feira, 27 de janeiro de 2020 00:58
    Moderador
  • Description: "Cannot insert duplicate key row in object 'dbo.ELE_TENANT' with unique index 'CNT_ELE_TENANT_UNQ_ID_fluig1'. The duplicate key value is (<NULL>).".

    Rubem, esse erro não é o mesmo que você citou inicialmente.

    O que está a ocorrer agora é que há uma coluna com a restrição UNIQUE e houve tentativa de incluir mais de uma linha sem informar valor para a coluna. Isto é, ficaria NULL se a inclusão não tivesse sido rejeitada.

    Verifique no mapeamento origem/destino se não se esqueceu de informar a origem da coluna ID_fluig1 na tabela ELE_TENANT.

     


    José Diz     Belo Horizonte, MG - Brasil     [ Novos recursos de programação para SQL Server ]


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

    • Marcado como Resposta Rubem Cerqueira segunda-feira, 27 de janeiro de 2020 13:31
    • Editado José Diz segunda-feira, 27 de janeiro de 2020 14:18
    segunda-feira, 27 de janeiro de 2020 12:37
  • Rubem, eis outra solução:

    -- código #2 v5
    -- Autor: José Diz / BH

    USE BDdestino;

    declare @ComandoSQL nvarchar(max);
    set @ComandoSQL= space(0);

    SELECT @ComandoSQL+=
           'INSERT into ' + quotename (schema_name (T.schema_id))
           + '.' + quotename (T.name) + ' with (tablock) ('
           + string_agg (case when C.name = 'ID_fluig'
                                   then quotename ('ID_fluig_tst')
                              else quotename (C.name) end, ', ')
    within group (order by C.name)
           + ') SELECT '
           + string_agg (case when C.name = 'ID_fluig'
                                   then quotename ('ID_fluig_tst')
                              else quotename (C.name) end, ', ')
    within group (order by C.name)
           + ' from BDorigem.' + quotename (schema_name (T.schema_id))
           + '.' + quotename (T.name)
           + '; ' + char(13)+char(10)
      from sys.tables as T
           inner join sys.columns as C on C.object_id = T.object_id
      group by T.name;
     
    PRINT @ComandoSQL;

    --EXECUTE (@ComandoSQL);

    Ela utiliza a função STRING_AGG().


    Como você comentou anteriormente que a versão do SQL Server é a 2012, a função STRING_AGG() pode ser substituída pela função STUFF(), conforme consta no artigo “Uso da função STRING_AGG para concatenar faixa de linhas de uma coluna”, obtendo-se então outra solução:

    -- código #3 v5
    -- Autor: José Diz / BH

    USE BDdestino;

    declare @ComandoSQL nvarchar(max);
    set @ComandoSQL= space(0);

    SELECT @ComandoSQL+=
           'INSERT into ' + quotename (schema_name (T.schema_id))
    + '.' + quotename (T.name) + ' with (tablock) ('
           + stuff ((SELECT ', ' + quotename (C.name)
                       from sys.columns as C
                       where C.object_id = T.object_id
                       order by C.name
                       for xml path(''), TYPE).value('.', 'varchar(max)'),
                    1, 2, '')
           + ') SELECT '
           + stuff ((SELECT ', ' + quotename (C.name)
                       from sys.columns as C
                       where C.object_id = T.object_id
                       order by C.name
                       for xml path(''), TYPE).value('.', 'varchar(max)'),
                    1, 2, '')
           + ' from BDorigem.' + quotename (schema_name (T.schema_id))
    + '.' + quotename (T.name)
           + '; '+ char(13)+char(10)
      from sys.tables as T;

    PRINT @ComandoSQL;  

    --EXECUTE (@ComandoSQL);


    José Diz     Belo Horizonte, MG - Brasil     [ Retirando acentuação e caracteres “invisíveis”... ]


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

    • Marcado como Resposta Rubem Cerqueira segunda-feira, 27 de janeiro de 2020 17:59
    • Editado José Diz quinta-feira, 30 de janeiro de 2020 12:34
    segunda-feira, 27 de janeiro de 2020 15:29
  • Rubem,

    Os exemplos de código que o José Diz montou estão corretos, a questão é que existe justamente esta diferença entre a origem e o destino.

    Minha sugestão, se for possível e você não veja dificuldades, seria realizar o procedimento de renomear a coluna ID_fluig_tst existente no banco destino para ID_Fluig, assim você terá o ambiente mais próximo do original e ficará mais fácil fazer qualquer tipo de comparação e análise.

    Utilize a System Stored Procedure SP_Rename para renomear os objetos existentes no seu banco de dados, veja abaixo o exemplo:

    EXEC sp_rename 'BancoDeDadosDestino.SuaTabelaDestino.ID_fluig_tst', 'ID_fluig', 'COLUMN'
    Go  

    O exemplo acima renomeia a coluna ID_Fluig_TST para ID_Fluig.

    Analise de este procedimento será necessário ser aplicado para outras colunas ou até mesmo tabelas.

    Se precisar renomear uma tabela, veja abaixo o exemplo:

    EXEC sp_rename 'BancoDeDadosDestino.TabelaA', 'TabelaB'
    Go 
    O exemplo acima altera o nome da TabelaA para TabelaB, sem provocar qualquer alteração na estrutura da tabela.


    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]

    • Marcado como Resposta Rubem Cerqueira terça-feira, 28 de janeiro de 2020 12:30
    segunda-feira, 27 de janeiro de 2020 19:43
    Moderador
  • Quando fui executar gerou esse erro 

    Nome de coluna 'ID_fluig_tst' inválido.

    No banco destino ID_fluig_tst existe no banco de origem está dessa forma ID_fluig

    Alguma dica para contorna ?

    Rubem, você pode:

    1. manter o comando EXECUTE desativado;
    2. copiar para a área de edição de consultas o comando SQL gerado pelo código #3, que foi exibido pelo PRINT na aba de mensagens;
    3. editar manualmente nas linhas em que exista a coluna ID_fluig_tst nas tabelas de destino,  substituindo "ID_fluig" por "ID_fluig_tst" na lista de colunas da tabela de destino; e
    4. comandar a execução do lote de comandos SQL.

    ---

    Somente para essa coluna que existe a exceção?

    Em toda tabela de origem que existe a coluna ID_fluig, na respectiva tabela de destino está ID_fluig_tst?

    ---

    Alterei os códigos #2 e #3, substituindo a ordenação na lista de colunas de
        order by C.column_id

    para
        order by C.name

    É que os códigos #2 e #3 foram criados com a premissa de que as estruturas eram as mesmas, conforme mencionado em resposta anterior. Mas se há nomes de colunas divergindo, pode ser também que as colunas não tenham sido declaradas na mesma sequência. Por precaução, fica então com ordenação por nome.


    José Diz     Belo Horizonte, MG - Brasil     [ Apagar conjunto de linhas em tabelas enormes ]


    • Marcado como Resposta Rubem Cerqueira terça-feira, 28 de janeiro de 2020 12:30
    • Editado José Diz quinta-feira, 30 de janeiro de 2020 12:35
    segunda-feira, 27 de janeiro de 2020 19:44
  • Rubem,

    A SQL Server Management Studio, tem por padrão um limite de caracteres e linhas retornadas na guia Resultados relacionados ao formato Texto.

    O comando PRINT não utiliza a aba Resultados mas sim a aba Mensagens. Logo, as sugestões que postou não tem nenhum efeito na limitação do PRINT.

    E trocar PRINT por SELECT também não resolve pois o código #3 retorna uma e única linha.


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


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

    José,

    Sim, você esta certo o Print vai retornar na guia Mensagens, alias sempre o resultado do comando Print é no formato texto e reconhecido como mensagem para o usuário, a guia resultado é para o formato gráfico.

    Em relação a este sua afirmação que esta correta mediante ao seu exemplo de código: E trocar PRINT por SELECT também não resolve pois o código #3 retorna uma e única linha.

    Acredito que para ajudar o Rubem, podemos então fazer uma alteração no seu exemplo, ao invês de utilizar uma variável para guardar o resultado da query dinâmica, torna-se possível deixar que o resultado seja apresentado diretamente na guia de Resultados e posteriormente o Rubem selecione o código, copia e cola no editor da query.

    Sendo assim, tomei a liberada de alterar uma parte do seu exemplo de código:

    -- Alterado para atender a necessidade do post, mantendo os direitos autorias --
    -- Foi removida a variável @ComandoSQL, fazendo com que o resultado seja apresentado diretamente na guia de resultados --
    Use BDDestino
    Go
    
    SELECT 
           'INSERT into ' + quotename (T.name) + ' with (tablock) (' 
           + string_agg (quotename (C.name), ', ') within group (order by C.name)
           + ') SELECT ' 
           + string_agg (quotename (C.name), ', ') within group (order by C.name)
           + ' from BDorigem..' + quotename (T.name) 
           + '; ' + char(13)+char(10)
      from sys.tables as T
           inner join sys.columns as C on C.object_id = T.object_id
      group by T.name
      Go
      
      -- Foi removido o comando Print e Execute --


    Veja uma ilustração do resultado obtido em um ambiente que utilizo como teste:

    A mesma alteração foi aplicada ao exemplo que utiliza a função de sistema Stuff:

    -- Direitos autorais do código pertencentes ao José Diz --

    SELECT 'INSERT into ' + quotename (schema_name (T.schema_id)) + '.' + quotename (T.name) + ' with (tablock) (' + stuff ((SELECT ', ' + quotename (C.name) from sys.columns as C where C.object_id = T.object_id order by C.column_id for xml path(''), TYPE).value('.', 'varchar(max)'), 1, 2, '') + ') SELECT ' + stuff ((SELECT ', ' + quotename (C.name) from sys.columns as C where C.object_id = T.object_id order by C.column_id for xml path(''), TYPE).value('.', 'varchar(max)'), 1, 2, '') + ' from BDorigem.' + quotename (schema_name (T.schema_id)) + '.' + quotename (T.name) + '; '+ char(13)+char(10) from sys.tables as T Go

    Ressalto que estas alterações foram realizadas mediante as últimas postagens que o Rubem publicou.


    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]


    terça-feira, 28 de janeiro de 2020 17:05
    Moderador
  • José, não funcionou!

    Segue como ficou retorno

    INSERT into [dbo].[ELE_TAG] with (tablock) ([ID], [ID_EXTERNAL], [ID_fluig_tst], [ID_FORUM_AREA], [ID_TENANT], [MODIFIED_BY], [MODIFIED_ON], [TITLE]) SELECT [ID], [ID_EXTERNAL], [ID_fluig_tst], [ID_FORUM_AREA], [ID_TENANT], [MODIFIED_BY], [MODIFIED_ON], [TITLE] from BDorigem.[dbo].[ELE_TAG]; 

    O correto no select na banco de origem ID_FLUIG

    Em outra mensagem você mencionou que "No banco destino ID_fluig_tst existe no banco de origem está dessa forma ID_fluig". O que eu compreendi é que no BDdestino está ID_fluig_tst e que no BDorigem está ID_fluig.

    Você poderia confirmar novamente em qual banco de dados está a coluna ID_fluig_tst? Só para eu ter certeza se entendi corretamente.

    ---

    Eis o código #3 revisado:

    -- código #3 v7
    -- Autor: José Diz / BH
    
    USE BDdestino;
    
    declare @ComandoSQL nvarchar(max);
    set @ComandoSQL= space(0);
    
    SELECT @ComandoSQL+=
           'INSERT into ' + quotename (schema_name (T.schema_id)) 
           + '.' + quotename (T.name) + ' with (tablock) (' 
           + stuff ((SELECT ', ' + quotename (C.name)
                       from sys.columns as C 
                       where C.object_id = T.object_id
                       order by C.name
                       for xml path(''), TYPE).value('.', 'varchar(max)'),
                    1, 2, '') 
           + ') SELECT ' 
           + stuff ((SELECT ', ' + case when C.name = 'ID_fluig_tst' 
                                             then quotename ('ID_fluig')
                                        else quotename (C.name) end
                       from sys.columns as C 
                       where C.object_id = T.object_id
                       order by C.name
                       for xml path(''), TYPE).value('.', 'varchar(max)'),
                    1, 2, '') 
           + ' from BDorigem.' + quotename (schema_name (T.schema_id)) 
           + '.' + quotename (T.name) 
           + '; '+ char(13)+char(10)
      from sys.tables as T;
    
    PRINT @ComandoSQL;  
    
    --EXECUTE (@ComandoSQL);


    José Diz     Belo Horizonte, MG - Brasil     [ Alas & Pivôs ]


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

    • Marcado como Resposta Rubem Cerqueira quarta-feira, 29 de janeiro de 2020 01:00
    • Editado José Diz quinta-feira, 30 de janeiro de 2020 12:37
    terça-feira, 28 de janeiro de 2020 21:42
  • Junior, sua dica atendeu minha necessidade. 

    Obrigado!

    Rubem,

    Ok, obrigado pelo retorno, somente fiz uma pequena alteração, a ideia e código foi de autoria do José Diz.


    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]

    • Marcado como Resposta Rubem Cerqueira quarta-feira, 29 de janeiro de 2020 01:00
    terça-feira, 28 de janeiro de 2020 23:31
    Moderador
  • Cannot insert explicit value for identity column in table 'WCM_APPLICATIONCATEGORY' when IDENTITY_INSERT is set to OFF.

    E chegamos às tabelas que possuem colunas com a propriedade IDENTITY.

    Eis o código #3 ampliado, com o tratamento de IDENTITY:

    -- código #3 v8
    -- Autor: José Diz / BH
    
    --USE BDdestino;
    
    declare @ComandoSQL nvarchar(max);
    set @ComandoSQL= space(0);
    
    SELECT @ComandoSQL+=
           -- ativa IDENTITY_INSERT, caso exista coluna identity na tabela
           case when exists (SELECT * from sys.columns as CI
                               where CI.object_id = T.object_id
                                     and CI.is_identity = 1)
                     then 'set IDENTITY_INSERT ' 
                          + quotename (schema_name (T.schema_id)) 
                          + '.' + quotename (T.name) 
                          + ' on;' + char(13)+char(10)
                     else '' end
    
           -- tabela de destino          
           + 'INSERT into ' + quotename (schema_name (T.schema_id)) 
           + '.' + quotename (T.name) + ' with (tablock) (' 
           + stuff ((SELECT ', ' + quotename (C.name)
                       from sys.columns as C 
                       where C.object_id = T.object_id
                       order by C.name
                       for xml path(''), TYPE).value('.', 'varchar(max)'),
                    1, 2, '') 
           + ') '

    -- tabela de origem
    + 'SELECT ' + stuff ((SELECT ', ' + case when C.name = 'ID_fluig_tst' then quotename ('ID_fluig') else quotename (C.name) end from sys.columns as C where C.object_id = T.object_id order by C.name for xml path(''), TYPE).value('.', 'varchar(max)'), 1, 2, '') + ' from BDorigem.' + quotename (schema_name (T.schema_id)) + '.' + quotename (T.name) + '; '+ char(13)+char(10) -- desativa IDENTITY_INSERT, caso exista coluna identity na tabela + case when exists (SELECT * from sys.columns as CI where CI.object_id = T.object_id and CI.is_identity = 1) then 'set IDENTITY_INSERT ' + quotename (schema_name (T.schema_id)) + '.' + quotename (T.name) + ' off;' + char(13)+char(10) else '' end
           --
           + char(10) from sys.tables as T; PRINT @ComandoSQL; --EXECUTE (@ComandoSQL);

    Me lembro de já ter respondido tópico com solicitação semelhante, mas ainda não o encontrei.


    José Diz     Belo Horizonte, MG - Brasil     [ Separar em partes uma lista de valores (string split) ]


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

    • Marcado como Resposta Rubem Cerqueira quarta-feira, 29 de janeiro de 2020 14:54
    • Editado José Diz quinta-feira, 30 de janeiro de 2020 12:39
    quarta-feira, 29 de janeiro de 2020 11:32
  • Rubem, criei outro código SQL para melhor controle sobre cada passo do roteiro de conversão de COLLATE. Ele é bem semelhante ao código #3, mas executa uma conversão de cada vez e retorna se houve erro. Ainda não o testei na bancada, mas espero que não tenha erros graves.

    O banco de dados de destino por enquanto é um banco de "testes", até que consiga a conversão completa?

    -- código #4
    -- Autor: José Diz / BH
    
    USE BDdestino;
    
    -- altera modelo de recuperação para simples
    ALTER DATABASE BDdestino set RECOVERY SIMPLE;
    BACKUP DATABASE BDdestino TO DISK = N'NUL'; -- declaração do cursor e variáveis para obter nomes das tabelas declare PorTabela cursor for SELECT name, schema_name (schema_id), object_id from sys.tables where type = 'U' and is_ms_shipped <> 1 order by schema_id, name for read only; declare @T_name sysname, @T_schema_name sysname, @T_object_id int; declare @ComandoSQL nvarchar(max), @erro int, @identity_on bit; -- OPEN PorTabela; -- obtém primeira tabela FETCH next from PorTabela into @T_name, @T_schema_name, @T_object_id; -- while @@FETCH_STATUS = 0 begin -- set @ComandoSQL= space(0); -- ativa IDENTITY_INSERT, caso exista coluna identity na tabela IF exists (SELECT * from sys.columns where object_id = @T_object_id and is_identity = 1) begin set @ComandoSQL+= 'set IDENTITY_INSERT ' + quotename (@T_schema_name) + '.' + quotename (@T_name) + ' on;' + char(13)+char(10); set @identity_on= 1; end else set @identity_on= 0; -- acrescenta tabela de destino no comando INSERT set @ComandoSQL+= 'INSERT into ' + quotename (@T_schema_name) + '.' + quotename (@T_name) + ' with (tablock) (' + stuff ((SELECT ', ' + quotename (C.name) from sys.columns as C where C.object_id = @T_object_id order by C.name for xml path(''), TYPE).value('.', 'varchar(max)'), 1, 2, '') + ') '; -- acrescenta tabela de origem no comando INSERT set @ComandoSQL+= 'SELECT ' + stuff ((SELECT ', ' + case when C.name = 'ID_fluig_tst' then quotename ('ID_fluig') else quotename (C.name) end from sys.columns as C where C.object_id = @T_object_id order by C.name for xml path(''), TYPE).value('.', 'varchar(max)'), 1, 2, '') + ' from BDorigem.' + quotename (@T_schema_name) + '.' + quotename (@T_name) + '; '+ char(13)+char(10); -- desativa IDENTITY_INSERT, caso tenha sido ativado IF @identity_on = 1 set @ComandoSQL+= 'set IDENTITY_INSERT ' + quotename (@T_schema_name)
    + '.' + quotename (@T_name) + ' off;' + char(13)+char(10); -- executa o comando SQL PRINT '---'; PRINT 'processando tabela ' + @T_schema_name + '.' + @T_name; --PRINT @ComandoSQL; set @erro= -1; EXECUTE @erro= sp_executesql @ComandoSQL; IF @erro <> 0 begin PRINT 'Ocorreu erro. Verifique'; PRINT @ComandoSQL; BREAK; end; -- CHECKPOINT; -- lê próxima tabela FETCH next from PorTabela into @T_name, @T_schema_name, @T_object_id; -- end; CLOSE PorTabela; DEALLOCATE PorTabela; -- retorna modelo de recuperação para COMPLETO ALTER DATABASE BDdestino set RECOVERY FULL;


    José Diz     Belo Horizonte, MG - Brasil     [ O Plano (de execução) Perfeito ]


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

    • Editado José Diz quinta-feira, 30 de janeiro de 2020 12:43
    • Marcado como Resposta Rubem Cerqueira quinta-feira, 30 de janeiro de 2020 12:48
    quinta-feira, 30 de janeiro de 2020 00:07
  • Olá José,  gerou esse erro conforme print.

    Essa tabela na origem é from fluig.[dbo].[FDN_fluig_SERVER] e tem mais tabelas desse tipo.

    No script 3 gerou consulta fiz essa alteração na mão.

    Ok, Rubem.

    O código #4 (bem como o #2 e o #3) foram construídos na premissa de que os bancos de dados (BDdestino e BDorigem) possuem a mesma estrutura. Pela mensagem de erro percebe-se que existe a tabela FDN_fluig1_SERVER no banco de dados de destino mas não existe no banco de dados de origem.

    O código #4 encerra o processamento no primeiro erro. Se quiser que o processamento continue, mesmo ocorrendo erros, basta retirar a linha com a instrução BREAK. Isto permite realizar uma análise geral dos erros e então efetuar as correções que não atendam à premissa.

       ...
    IF @erro <> 0 begin PRINT 'Ocorreu erro. Verifique'; PRINT @ComandoSQL; --BREAK; end;
    ...


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


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

    • Editado José Diz quinta-feira, 30 de janeiro de 2020 15:07
    • Marcado como Resposta Rubem Cerqueira quinta-feira, 30 de janeiro de 2020 20:19
    quinta-feira, 30 de janeiro de 2020 14:07

Todas as Respostas

  • Rubem,

    A imagem não esta ajudando muito a conseguir observar os erros.

    Você poderia descrever o que esta tentando fazer em relação a importação dos dados:

    1 - Você esta importando dados via qual tipo de arquivo?

    2 - Qual é a versão do SQL Server que você esta utilizando?

    3 - Qual é a versão do SQL Server Management Studio que você esta utilizando?

    4 - Na tela de configuração dos tipos de dados você realizou alguma alteração?

    5 - Você esta criando uma nova tela ou tentando inserir dados em uma já existente?

    ----------------------------

    Ao final do processo de importação é gerado um arquivo contendo o resumo do processo, mesmo que ocorra erros, você chegou a acessar este arquivo?


    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]

    domingo, 26 de janeiro de 2020 18:24
    Moderador
  • Galvão, obrigado.

    1 - Você esta importando dados via qual tipo de arquivo?

    Estou importando via driver(SQL ServerNative Client) Banco A -> Banco B que contém a mesma estruturas=

    2 - Qual é a versão do SQL Server que você esta utilizando?

    Microsoft SQL Server 2012 (SP4) (KB4018073) -

    3 - Qual é a versão do SQL Server Management Studio que você esta utilizando?

    Microsoft SQL Server Management Studio 11.0.7001.0

    4 - Na tela de configuração dos tipos de dados você realizou alguma alteração?

    Só habilitei essa opção Habilitar inserção de identidade

    5 - Você esta criando uma nova tela ou tentando inserir dados em uma já existente?

    Estou inserindo dados novo banco

    Segue erro 

    Error 0xc0202009: Data Flow Task 53: SSIS Error Code DTS_E_OLEDBERROR.  An OLE DB error has occurred. Error code: 0x80004005.
    An OLE DB record is available.  Source: "Microsoft SQL Server Native Client 11.0"  Hresult: 0x80004005  Description: "Cannot insert duplicate key row in object 'dbo.ELE_TENANT' with unique index 'CNT_ELE_TENANT_UNQ_ID_fluig1'. The duplicate key value is (<NULL>).".
     (SQL Server Import and Export Wizard)
     
    Error 0xc0209029: Data Flow Task 53: SSIS Error Code DTS_E_INDUCEDTRANSFORMFAILUREONERROR.  The "Destination 260 - ELE_TENANT.Inputs[Destination Input]" failed because error code 0xC020907B occurred, and the error row disposition on "Destination 260 - ELE_TENANT.Inputs[Destination Input]" specifies failure on error. An error occurred on the specified object of the specified component.  There may be error messages posted before this with more information about the failure.
     (SQL Server Import and Export Wizard)
     
    Error 0xc0047022: Data Flow Task 53: SSIS Error Code DTS_E_PROCESSINPUTFAILED.  The ProcessInput method on component "Destination 260 - ELE_TENANT" (52) failed with error code 0xC0209029 while processing input "Destination Input" (65). The identified component returned an error from the ProcessInput method. The error is specific to the component, but the error is fatal and will cause the Data Flow task to stop running.  There may be error messages posted before this with more information about the failure.

    domingo, 26 de janeiro de 2020 19:26
  • Objetivo é trocar collate do banco e tabelas.

    domingo, 26 de janeiro de 2020 19:29
  • Como faço para desabilitar chave primária e depois habilitar ?

    Olá Rubem.

    Algumas restrições podem ser desativadas e depois reativadas (desde que não haja nada contrário à regra da restrição). No caso de chave primária é necessário removê-la e depois recriá-la. Para remover a chave primária basta executar o seguinte comando:

    ALTER TABLE nome_tabela DROP CONSTRAINT nome_índice;

    Entretanto, como está a ocorrer violação na restrição de chave primária significa que há tentativa de inserir linhas com valores repetidos na coluna que é a chave primária. Ou seja, é possível remover a restrição de chave primária mas depois não haverá como criar uma chave primária em coluna que contenha valores repetidos.

     


    José Diz     Belo Horizonte, MG - Brasil     [ Retirando acentuação (e caracteres “invisíveis”) com a função TRANSLATE ]


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

    • Editado José Diz quinta-feira, 30 de janeiro de 2020 12:44
    domingo, 26 de janeiro de 2020 19:40
  • Rubem,

    Obrigado pelo retorno, a mensagem de erro apresentada deixa bem claro:

    ""Cannot insert duplicate key row in object 'dbo.ELE_TENANT' with unique index 'CNT_ELE_TENANT_UNQ_ID_fluig1'. The duplicate key value is (<NULL>)."."

    Você esta tentando inserir valores na tabela Ele_Tenant que a coluna ID_fluig1 contem o index unique index 'CNT_ELE_TENANT_UNQ_ID_fluig1. Não é permitido inserir valores duplicados neste coluna ou valores nulos.

    ------------------------------------------------

    Pelo que entendi estes bancos de dados estão no mesmo Servidor.

    - Se realmente for esse o cenário, uma alternativa ao meu ver mais fácil, seria ao invês de utilizar a ferramenta Import/Export Data, proceder a execução de um Insert...Select, fazendo o Insert de dados na tabela existente no banco de dados B, sendo estes coletados via Select no banco de Dados A.

    Veja o exemplo:

    -- Inserindo os dados --
    Insert Into BancoDeDadosB.dbo.TabelaDestino (Coluna1, Coluna2,......)
    Select Coluna1, Coluna2,....... From BancoDeDadosA.dbo.TabelaOrigem
    Go

    Se for o caso, antes de realizar este procedimento verifique se é necessário excluir os dados atuais na tabela existente no banco de dados B.

    Vale também ressaltar que tanto no Insert como no Select você pode especificar as tabelas que deseja utilizar.

    Em adicional, você pode montar toda lógica necessária ao seu comando Select, utilizando filtros, ordenações e agrupamentos o que vai resultar nos dados que deverão ser repassados para o comando Insert.


    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]


    segunda-feira, 27 de janeiro de 2020 00:58
    Moderador
  • Description: "Cannot insert duplicate key row in object 'dbo.ELE_TENANT' with unique index 'CNT_ELE_TENANT_UNQ_ID_fluig1'. The duplicate key value is (<NULL>).".

    Rubem, esse erro não é o mesmo que você citou inicialmente.

    O que está a ocorrer agora é que há uma coluna com a restrição UNIQUE e houve tentativa de incluir mais de uma linha sem informar valor para a coluna. Isto é, ficaria NULL se a inclusão não tivesse sido rejeitada.

    Verifique no mapeamento origem/destino se não se esqueceu de informar a origem da coluna ID_fluig1 na tabela ELE_TENANT.

     


    José Diz     Belo Horizonte, MG - Brasil     [ Novos recursos de programação para SQL Server ]


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

    • Marcado como Resposta Rubem Cerqueira segunda-feira, 27 de janeiro de 2020 13:31
    • Editado José Diz segunda-feira, 27 de janeiro de 2020 14:18
    segunda-feira, 27 de janeiro de 2020 12:37
  • Galvão, qual melhor forma de importa total 5 mil tabelas?

    Tem algum script  para facilitar esse processo ?

    segunda-feira, 27 de janeiro de 2020 14:10
  • Rubem, vai utilizar T-SQL ou SSIS?

    Todas as tabelas estão em um mesmo banco de dados ou em vários bancos de dados?

    A origem e o destino estão no mesmo computador ou em computadores diferentes?


    José Diz     Belo Horizonte, MG - Brasil     [ Modelos de manutenção do software SQL Server ]


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

    • Editado José Diz segunda-feira, 27 de janeiro de 2020 14:19
    segunda-feira, 27 de janeiro de 2020 14:16
  • Rubem, vai utilizar T-SQL ou SSIS?

    T-SQL

    Todas as tabelas estão em um mesmo banco de dados ou em vários bancos de dados?

    No mesmo Banco

    A origem e o destino estão no mesmo computador ou em computadores diferentes?

    No mesmo computador

    segunda-feira, 27 de janeiro de 2020 14:23
  • T-SQL
    No mesmo Banco

    No mesmo computador

    Como ponto de partida você pode utilizar o procedimento sp_MSforeachtable. No artigo An introduction to sp_MSforeachtable; run commands iteratively through all tables in a database há introdução sobre a utilização desse procedimento, inclusive com a descrição dos parâmetros.

    Somente como demonstração, eis exemplo da utilização:

    -- código #1
    USE BDdestino;

    EXECUTE SYS.sp_MSforeachtable 'INSERT into [?] with (tablock) SELECT * from BDorigem.[?];

     
    Você pode consultar o artigo Qual é mais rápido: “SELECT … into” ou “INSERT … SELECT”? para obter detalhes sobre como otimizar a execução de INSERt ... SELECT.


    José Diz     Belo Horizonte, MG - Brasil     [ Para onde foi o 23:59:59.999?! ]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.
    • Editado José Diz quinta-feira, 30 de janeiro de 2020 12:32
    segunda-feira, 27 de janeiro de 2020 14:46
  • Rubem, eis outra solução:

    -- código #2 v5
    -- Autor: José Diz / BH

    USE BDdestino;

    declare @ComandoSQL nvarchar(max);
    set @ComandoSQL= space(0);

    SELECT @ComandoSQL+=
           'INSERT into ' + quotename (schema_name (T.schema_id))
           + '.' + quotename (T.name) + ' with (tablock) ('
           + string_agg (case when C.name = 'ID_fluig'
                                   then quotename ('ID_fluig_tst')
                              else quotename (C.name) end, ', ')
    within group (order by C.name)
           + ') SELECT '
           + string_agg (case when C.name = 'ID_fluig'
                                   then quotename ('ID_fluig_tst')
                              else quotename (C.name) end, ', ')
    within group (order by C.name)
           + ' from BDorigem.' + quotename (schema_name (T.schema_id))
           + '.' + quotename (T.name)
           + '; ' + char(13)+char(10)
      from sys.tables as T
           inner join sys.columns as C on C.object_id = T.object_id
      group by T.name;
     
    PRINT @ComandoSQL;

    --EXECUTE (@ComandoSQL);

    Ela utiliza a função STRING_AGG().


    Como você comentou anteriormente que a versão do SQL Server é a 2012, a função STRING_AGG() pode ser substituída pela função STUFF(), conforme consta no artigo “Uso da função STRING_AGG para concatenar faixa de linhas de uma coluna”, obtendo-se então outra solução:

    -- código #3 v5
    -- Autor: José Diz / BH

    USE BDdestino;

    declare @ComandoSQL nvarchar(max);
    set @ComandoSQL= space(0);

    SELECT @ComandoSQL+=
           'INSERT into ' + quotename (schema_name (T.schema_id))
    + '.' + quotename (T.name) + ' with (tablock) ('
           + stuff ((SELECT ', ' + quotename (C.name)
                       from sys.columns as C
                       where C.object_id = T.object_id
                       order by C.name
                       for xml path(''), TYPE).value('.', 'varchar(max)'),
                    1, 2, '')
           + ') SELECT '
           + stuff ((SELECT ', ' + quotename (C.name)
                       from sys.columns as C
                       where C.object_id = T.object_id
                       order by C.name
                       for xml path(''), TYPE).value('.', 'varchar(max)'),
                    1, 2, '')
           + ' from BDorigem.' + quotename (schema_name (T.schema_id))
    + '.' + quotename (T.name)
           + '; '+ char(13)+char(10)
      from sys.tables as T;

    PRINT @ComandoSQL;  

    --EXECUTE (@ComandoSQL);


    José Diz     Belo Horizonte, MG - Brasil     [ Retirando acentuação e caracteres “invisíveis”... ]


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

    • Marcado como Resposta Rubem Cerqueira segunda-feira, 27 de janeiro de 2020 17:59
    • Editado José Diz quinta-feira, 30 de janeiro de 2020 12:34
    segunda-feira, 27 de janeiro de 2020 15:29
  • Rubem,

    As soluções apresentadas pelo José Diz com certeza vão te atender. Uma observação que eu gostaria de fazer, antes de iniciar o processo de importação destas 5.000 tabelas, altere o modelo de recuperação do seu banco de dados para Bulk Logged, desta forma, você vai enviar uma maior sobrecarga de processamento durante a importação dos dados, bem como, o arquivo de log não será tão utilizado para registrar o que estará sendo processado.


    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]


    segunda-feira, 27 de janeiro de 2020 16:41
    Moderador
  • Quando fui executar gerou esse erro 

    Nome de coluna 'ID_fluig_tst' inválido.

    No banco destino ID_fluig_tst existe no banco de origem está dessa forma ID_fluig

    Alguma dica para contorna ?


    segunda-feira, 27 de janeiro de 2020 18:51
  • Rubem,

    Os exemplos de código que o José Diz montou estão corretos, a questão é que existe justamente esta diferença entre a origem e o destino.

    Minha sugestão, se for possível e você não veja dificuldades, seria realizar o procedimento de renomear a coluna ID_fluig_tst existente no banco destino para ID_Fluig, assim você terá o ambiente mais próximo do original e ficará mais fácil fazer qualquer tipo de comparação e análise.

    Utilize a System Stored Procedure SP_Rename para renomear os objetos existentes no seu banco de dados, veja abaixo o exemplo:

    EXEC sp_rename 'BancoDeDadosDestino.SuaTabelaDestino.ID_fluig_tst', 'ID_fluig', 'COLUMN'
    Go  

    O exemplo acima renomeia a coluna ID_Fluig_TST para ID_Fluig.

    Analise de este procedimento será necessário ser aplicado para outras colunas ou até mesmo tabelas.

    Se precisar renomear uma tabela, veja abaixo o exemplo:

    EXEC sp_rename 'BancoDeDadosDestino.TabelaA', 'TabelaB'
    Go 
    O exemplo acima altera o nome da TabelaA para TabelaB, sem provocar qualquer alteração na estrutura da tabela.


    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]

    • Marcado como Resposta Rubem Cerqueira terça-feira, 28 de janeiro de 2020 12:30
    segunda-feira, 27 de janeiro de 2020 19:43
    Moderador
  • Quando fui executar gerou esse erro 

    Nome de coluna 'ID_fluig_tst' inválido.

    No banco destino ID_fluig_tst existe no banco de origem está dessa forma ID_fluig

    Alguma dica para contorna ?

    Rubem, você pode:

    1. manter o comando EXECUTE desativado;
    2. copiar para a área de edição de consultas o comando SQL gerado pelo código #3, que foi exibido pelo PRINT na aba de mensagens;
    3. editar manualmente nas linhas em que exista a coluna ID_fluig_tst nas tabelas de destino,  substituindo "ID_fluig" por "ID_fluig_tst" na lista de colunas da tabela de destino; e
    4. comandar a execução do lote de comandos SQL.

    ---

    Somente para essa coluna que existe a exceção?

    Em toda tabela de origem que existe a coluna ID_fluig, na respectiva tabela de destino está ID_fluig_tst?

    ---

    Alterei os códigos #2 e #3, substituindo a ordenação na lista de colunas de
        order by C.column_id

    para
        order by C.name

    É que os códigos #2 e #3 foram criados com a premissa de que as estruturas eram as mesmas, conforme mencionado em resposta anterior. Mas se há nomes de colunas divergindo, pode ser também que as colunas não tenham sido declaradas na mesma sequência. Por precaução, fica então com ordenação por nome.


    José Diz     Belo Horizonte, MG - Brasil     [ Apagar conjunto de linhas em tabelas enormes ]


    • Marcado como Resposta Rubem Cerqueira terça-feira, 28 de janeiro de 2020 12:30
    • Editado José Diz quinta-feira, 30 de janeiro de 2020 12:35
    segunda-feira, 27 de janeiro de 2020 19:44
  • José, fiz esse ajuste e deu ok.

    Tenho uma dúvida, no ambiente temos total de 5000 tabelas, o script só retornou 70 tabelas.

    Alguma dica ?

    terça-feira, 28 de janeiro de 2020 12:31
  • José, fiz esse ajuste e deu ok.
    Tenho uma dúvida, no ambiente temos total de 5000 tabelas, o script só retornou 70 tabelas.
    Alguma dica ?

    Provavelmente ocorreu truncamento na exibição do comando PRINT, no management studio.

    Em toda tabela de origem que existe a coluna ID_fluig, na respectiva tabela de destino está ID_fluig_tst? Posso alterar o código #3 para fazer essa alteração durante a geração dos comandos SQL.


    José Diz     Belo Horizonte, MG - Brasil     [ Particionamento de tabela na edição Express ]


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

    • Editado José Diz quinta-feira, 30 de janeiro de 2020 12:35
    terça-feira, 28 de janeiro de 2020 15:05
  • Rubem,

    A SQL Server Management Studio, tem por padrão um limite de caracteres e linhas retornadas na guia Resultados relacionados ao formato Texto.

    O comando PRINT não utiliza a aba Resultados mas sim a aba Mensagens. Logo, as sugestões que postou não tem nenhum efeito na limitação do PRINT.

    E trocar PRINT por SELECT também não resolve pois o código #3 retorna uma e única linha.


    José Diz     Belo Horizonte, MG - Brasil     [ Quem sabe, faz. Quem não sabe, ... ]


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

    • Editado José Diz quinta-feira, 30 de janeiro de 2020 12:41
    terça-feira, 28 de janeiro de 2020 15:55
  • Rubem,

    A SQL Server Management Studio, tem por padrão um limite de caracteres e linhas retornadas na guia Resultados relacionados ao formato Texto.

    O comando PRINT não utiliza a aba Resultados mas sim a aba Mensagens. Logo, as sugestões que postou não tem nenhum efeito na limitação do PRINT.

    E trocar PRINT por SELECT também não resolve pois o código #3 retorna uma e única linha.


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


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

    José,

    Sim, você esta certo o Print vai retornar na guia Mensagens, alias sempre o resultado do comando Print é no formato texto e reconhecido como mensagem para o usuário, a guia resultado é para o formato gráfico.

    Em relação a este sua afirmação que esta correta mediante ao seu exemplo de código: E trocar PRINT por SELECT também não resolve pois o código #3 retorna uma e única linha.

    Acredito que para ajudar o Rubem, podemos então fazer uma alteração no seu exemplo, ao invês de utilizar uma variável para guardar o resultado da query dinâmica, torna-se possível deixar que o resultado seja apresentado diretamente na guia de Resultados e posteriormente o Rubem selecione o código, copia e cola no editor da query.

    Sendo assim, tomei a liberada de alterar uma parte do seu exemplo de código:

    -- Alterado para atender a necessidade do post, mantendo os direitos autorias --
    -- Foi removida a variável @ComandoSQL, fazendo com que o resultado seja apresentado diretamente na guia de resultados --
    Use BDDestino
    Go
    
    SELECT 
           'INSERT into ' + quotename (T.name) + ' with (tablock) (' 
           + string_agg (quotename (C.name), ', ') within group (order by C.name)
           + ') SELECT ' 
           + string_agg (quotename (C.name), ', ') within group (order by C.name)
           + ' from BDorigem..' + quotename (T.name) 
           + '; ' + char(13)+char(10)
      from sys.tables as T
           inner join sys.columns as C on C.object_id = T.object_id
      group by T.name
      Go
      
      -- Foi removido o comando Print e Execute --


    Veja uma ilustração do resultado obtido em um ambiente que utilizo como teste:

    A mesma alteração foi aplicada ao exemplo que utiliza a função de sistema Stuff:

    -- Direitos autorais do código pertencentes ao José Diz --

    SELECT 'INSERT into ' + quotename (schema_name (T.schema_id)) + '.' + quotename (T.name) + ' with (tablock) (' + stuff ((SELECT ', ' + quotename (C.name) from sys.columns as C where C.object_id = T.object_id order by C.column_id for xml path(''), TYPE).value('.', 'varchar(max)'), 1, 2, '') + ') SELECT ' + stuff ((SELECT ', ' + quotename (C.name) from sys.columns as C where C.object_id = T.object_id order by C.column_id for xml path(''), TYPE).value('.', 'varchar(max)'), 1, 2, '') + ' from BDorigem.' + quotename (schema_name (T.schema_id)) + '.' + quotename (T.name) + '; '+ char(13)+char(10) from sys.tables as T Go

    Ressalto que estas alterações foram realizadas mediante as últimas postagens que o Rubem publicou.


    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]


    terça-feira, 28 de janeiro de 2020 17:05
    Moderador
  • Provavelmente ocorreu truncamento na exibição do comando PRINT, no management studio.

    Em toda tabela de origem que existe a coluna ID_fluig, na respectiva tabela de destino está ID_fluig_tst? Posso alterar o código #3 para fazer essa alteração durante a geração dos comandos SQL. 

    R: Correto 

    terça-feira, 28 de janeiro de 2020 17:30
  • Em toda tabela de origem que existe a coluna ID_fluig, na respectiva tabela de destino está ID_fluig_tst? Posso alterar o código #3 para fazer essa alteração durante a geração dos comandos SQL. 

    R: Correto 

    Ok.

    Avalie então a seguinte atualização:

    -- código #3 v6
    -- Autor: José Diz / BH
    
    USE BDdestino;
    
    declare @ComandoSQL nvarchar(max);
    set @ComandoSQL= space(0);
    
    SELECT @ComandoSQL+=
           'INSERT into ' + quotename (schema_name (T.schema_id)) 
           + '.' + quotename (T.name) + ' with (tablock) (' 
           + stuff ((SELECT ', ' + case when C.name = 'ID_fluig' 
                                             then quotename ('ID_fluig_tst')
                                        else quotename (C.name) end
                       from sys.columns as C 
                       where C.object_id = T.object_id
                       order by C.name
                       for xml path(''), TYPE).value('.', 'varchar(max)'),
                    1, 2, '') 
           + ') SELECT ' 
           + stuff ((SELECT ', ' + quotename (C.name)
                       from sys.columns as C 
                       where C.object_id = T.object_id
                       order by C.name
                       for xml path(''), TYPE).value('.', 'varchar(max)'),
                    1, 2, '') 
           + ' from BDorigem.' + quotename (schema_name (T.schema_id)) 
           + '.' + quotename (T.name) 
           + '; '+ char(13)+char(10)
      from sys.tables as T;
    
    PRINT @ComandoSQL;  
    
    --EXECUTE (@ComandoSQL);

    Observe que acrescentei também o nome do esquema tanto na tabela de destino quanto na de origem. É para os casos em que exista mais de uma tabela com mesmo nome mas em esquemas diferentes.

    Substitua BDorigem pelo nome do banco de origem e BDdestino pelo nome do banco de destino.


    José Diz     Belo Horizonte, MG - Brasil     [ Obter o enésimo elemento de uma lista ]


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

    • Editado José Diz quinta-feira, 30 de janeiro de 2020 12:36
    terça-feira, 28 de janeiro de 2020 18:55
  • Junior, sua dica atendeu minha necessidade. 

    Obrigado!

    terça-feira, 28 de janeiro de 2020 20:16
  • José, não funcionou!

    Segue como ficou retorno

    INSERT into [dbo].[ELE_TAG] with (tablock) ([ID], [ID_EXTERNAL], [ID_fluig_tst], [ID_FORUM_AREA], [ID_TENANT], [MODIFIED_BY], [MODIFIED_ON], [TITLE]) SELECT [ID], [ID_EXTERNAL], [ID_fluig_tst], [ID_FORUM_AREA], [ID_TENANT], [MODIFIED_BY], [MODIFIED_ON], [TITLE] from BDorigem.[dbo].[ELE_TAG]; 
    

    O correto no select na banco de origem ID_FLUIG

    terça-feira, 28 de janeiro de 2020 20:20
  • José, não funcionou!

    Segue como ficou retorno

    INSERT into [dbo].[ELE_TAG] with (tablock) ([ID], [ID_EXTERNAL], [ID_fluig_tst], [ID_FORUM_AREA], [ID_TENANT], [MODIFIED_BY], [MODIFIED_ON], [TITLE]) SELECT [ID], [ID_EXTERNAL], [ID_fluig_tst], [ID_FORUM_AREA], [ID_TENANT], [MODIFIED_BY], [MODIFIED_ON], [TITLE] from BDorigem.[dbo].[ELE_TAG]; 

    O correto no select na banco de origem ID_FLUIG

    Em outra mensagem você mencionou que "No banco destino ID_fluig_tst existe no banco de origem está dessa forma ID_fluig". O que eu compreendi é que no BDdestino está ID_fluig_tst e que no BDorigem está ID_fluig.

    Você poderia confirmar novamente em qual banco de dados está a coluna ID_fluig_tst? Só para eu ter certeza se entendi corretamente.

    ---

    Eis o código #3 revisado:

    -- código #3 v7
    -- Autor: José Diz / BH
    
    USE BDdestino;
    
    declare @ComandoSQL nvarchar(max);
    set @ComandoSQL= space(0);
    
    SELECT @ComandoSQL+=
           'INSERT into ' + quotename (schema_name (T.schema_id)) 
           + '.' + quotename (T.name) + ' with (tablock) (' 
           + stuff ((SELECT ', ' + quotename (C.name)
                       from sys.columns as C 
                       where C.object_id = T.object_id
                       order by C.name
                       for xml path(''), TYPE).value('.', 'varchar(max)'),
                    1, 2, '') 
           + ') SELECT ' 
           + stuff ((SELECT ', ' + case when C.name = 'ID_fluig_tst' 
                                             then quotename ('ID_fluig')
                                        else quotename (C.name) end
                       from sys.columns as C 
                       where C.object_id = T.object_id
                       order by C.name
                       for xml path(''), TYPE).value('.', 'varchar(max)'),
                    1, 2, '') 
           + ' from BDorigem.' + quotename (schema_name (T.schema_id)) 
           + '.' + quotename (T.name) 
           + '; '+ char(13)+char(10)
      from sys.tables as T;
    
    PRINT @ComandoSQL;  
    
    --EXECUTE (@ComandoSQL);


    José Diz     Belo Horizonte, MG - Brasil     [ Alas & Pivôs ]


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

    • Marcado como Resposta Rubem Cerqueira quarta-feira, 29 de janeiro de 2020 01:00
    • Editado José Diz quinta-feira, 30 de janeiro de 2020 12:37
    terça-feira, 28 de janeiro de 2020 21:42
  • Junior, sua dica atendeu minha necessidade. 

    Obrigado!

    Rubem,

    Ok, obrigado pelo retorno, somente fiz uma pequena alteração, a ideia e código foi de autoria do José Diz.


    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]

    • Marcado como Resposta Rubem Cerqueira quarta-feira, 29 de janeiro de 2020 01:00
    terça-feira, 28 de janeiro de 2020 23:31
    Moderador
  • Olá José, tratativa funcionou.

    Quando executei insert gerou esse erro :

    Mensagem 206, Nível 16, Estado 2, Linha 35
    Operand type clash: int is incompatible with datetime2Mensagem 206, Nível 16, Estado 2, Linha 35
    Operand type clash: int is incompatible with datetime2
    Mensagem 206, Nível 16, Estado 2, Linha 38
    Operand type clash: datetime2 is incompatible with bigint
    Mensagem 206, Nível 16, Estado 2, Linha 40
    Operand type clash: date is incompatible with int
    Mensagem 206, Nível 16, Estado 2, Linha 50
    Operand type clash: image is incompatible with varchar
    Mensagem 206, Nível 16, Estado 2, Linha 55
    Operand type clash: bit is incompatible with datetime2
    Mensagem 206, Nível 16, Estado 2, Linha 56
    Operand type clash: image is incompatible with varchar
    Mensagem 206, Nível 16, Estado 2, Linha 59
    Operand type clash: datetime2 is incompatible with bigint
    Mensagem 206, Nível 16, Estado 2, Linha 68
    Operand type clash: text is incompatible with int
    Mensagem 206, Nível 16, Estado 2, Linha 69
    Operand type clash: bigint is incompatible with datetime2
    Mensagem 257, Nível 16, Estado 3, Linha 86
    Implicit conversion from data type datetime to bigint is not allowed. Use the CONVERT function to run this query.
    Mensagem 206, Nível 16, Estado 2, Linha 91
    Operand type clash: image is incompatible with varchar
    Mensagem 206, Nível 16, Estado 2, Linha 95
    Operand type clash: datetime2 is incompatible with int
    Mensagem 257, Nível 16, Estado 3, Linha 99
    Implicit conversion from data type datetime to bigint is not allowed. Use the CONVERT function to run this query.
    Mensagem 206, Nível 16, Estado 2, Linha 114
    Operand type clash: bigint is incompatible with datetime2
    Mensagem 206, Nível 16, Estado 2, Linha 131
    Operand type clash: datetime2 is incompatible with bigint
    Mensagem 206, Nível 16, Estado 2, Linha 140
    Operand type clash: date is incompatible with bigint
    Mensagem 206, Nível 16, Estado 2, Linha 145
    Operand type clash: text is incompatible with bigint
    Mensagem 206, Nível 16, Estado 2, Linha 152
    Operand type clash: date is incompatible with int
    Mensagem 206, Nível 16, Estado 2, Linha 166
    Operand type clash: image is incompatible with varchar
    Mensagem 206, Nível 16, Estado 2, Linha 198
    Operand type clash: text is incompatible with bit
    Mensagem 206, Nível 16, Estado 2, Linha 201
    Operand type clash: datetime2 is incompatible with int

    Segue a linha dos erros

    INSERT into [dbo].[ECM_COLLABORATION] with (tablock) ([COLLABORATION_ID], [IS_ACTIVE], [DOCUMENT_ID], [DOCUMENT_VERSION], [END_DATE], [EXTENSION], [EXTERNAL_FILE_ID], [EXTERNAL_URL], [SOURCE_DOC_ID], [SOURCE_DOC_VERSION], [START_DATE], [TENANT_ID], [UPLOADER_LOGIN], [COLLABORATION_APP_ID]) SELECT [COLLABORATION_APP_ID], [COLLABORATION_ID], [DOCUMENT_ID], [DOCUMENT_VERSION], [END_DATE], [EXTENSION], [EXTERNAL_FILE_ID], [EXTERNAL_URL], [IS_ACTIVE], [SOURCE_DOC_ID], [SOURCE_DOC_VERSION], [START_DATE], [TENANT_ID], [UPLOADER_LOGIN] from fluig.[dbo].[ECM_COLLABORATION];   
    INSERT into [dbo].[NG_QRTZ_JOB_DETAILS] with (tablock) ([SCHED_NAME], [JOB_NAME], [JOB_GROUP], [DESCRIPTION], [JOB_CLASS_NAME], [IS_DURABLE], [IS_NONCONCURRENT], [IS_UPDATE_DATA], [REQUESTS_RECOVERY], [JOB_DATA]) SELECT [DESCRIPTION], [IS_DURABLE], [IS_NONCONCURRENT], [IS_UPDATE_DATA], [JOB_CLASS_NAME], [JOB_DATA], [JOB_GROUP], [JOB_NAME], [REQUESTS_RECOVERY], [SCHED_NAME] from fluig.[dbo].[NG_QRTZ_JOB_DETAILS];   
    


    quarta-feira, 29 de janeiro de 2020 01:02
  • INSERT into [dbo].[ECM_COLLABORATION] with (tablock) ([COLLABORATION_ID], [IS_ACTIVE], [DOCUMENT_ID], [DOCUMENT_VERSION], [END_DATE], [EXTENSION], [EXTERNAL_FILE_ID], [EXTERNAL_URL], [SOURCE_DOC_ID], [SOURCE_DOC_VERSION], [START_DATE], [TENANT_ID], [UPLOADER_LOGIN], [COLLABORATION_APP_ID])

    SELECT [COLLABORATION_APP_ID], [COLLABORATION_ID], [DOCUMENT_ID], [DOCUMENT_VERSION], [END_DATE], [EXTENSION], [EXTERNAL_FILE_ID], [EXTERNAL_URL], [IS_ACTIVE], [SOURCE_DOC_ID], [SOURCE_DOC_VERSION], [START_DATE], [TENANT_ID], [UPLOADER_LOGIN]
      from fluig.[dbo].[ECM_COLLABORATION];

    Rubem, tem algo estranho. As colunas na tabela de destino não estão em ordem alfabética, conforme está programado no código #3 v7.

    O que
         order by C.name

    faz é justamente colocar os nomes das colunas em ordem alfabética.

    Você pode conferir se o teste que fez foi com ordenação pelo nome da coluna?


    José Diz     Belo Horizonte, MG - Brasil     [ Geração de sequências numéricas ]


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

    • Editado José Diz quinta-feira, 30 de janeiro de 2020 12:38
    quarta-feira, 29 de janeiro de 2020 01:16
  • Olá José, verdade acabei pegando o código errado.

    Estou com essa erro

    (0 linhas afetadas)
    Mensagem 544, Nível 16, Estado 1, Linha 5
    Cannot insert explicit value for identity column in table 'WCM_APPLICATIONCATEGORY' when IDENTITY_INSERT is set to OFF.
    Mensagem 544, Nível 16, Estado 1, Linha 6
    Cannot insert explicit value for identity column in table 'ECM_ABSTRACT_FORM_ITEM' when IDENTITY_INSERT is set to OFF.

    (2596 linhas afetadas)

    (888 linhas afetadas)

    (1316 linhas afetadas)

    (0 linhas afetadas)

    (0 linhas afetadas)

    (0 linhas afetadas)

    (8 linhas afetadas)
    Mensagem 544, Nível 16, Estado 1, Linha 14
    Cannot insert explicit value for identity column in table 'SociableLike' when IDENTITY_INSERT is set to OFF.
    Mensagem 544, Nível 16, Estado 1, Linha 15
    Cannot insert explicit value for identity column in table 'FDN_DOWNLOADNOTIFY' when IDENTITY_INSERT is set to OFF.

    usando o comando SET WCM_APPLICATIONCATEGORY On resolve, mas só posso ter uma tabela por execução ?

    quarta-feira, 29 de janeiro de 2020 02:30
  • Cannot insert explicit value for identity column in table 'WCM_APPLICATIONCATEGORY' when IDENTITY_INSERT is set to OFF.

    E chegamos às tabelas que possuem colunas com a propriedade IDENTITY.

    Eis o código #3 ampliado, com o tratamento de IDENTITY:

    -- código #3 v8
    -- Autor: José Diz / BH
    
    --USE BDdestino;
    
    declare @ComandoSQL nvarchar(max);
    set @ComandoSQL= space(0);
    
    SELECT @ComandoSQL+=
           -- ativa IDENTITY_INSERT, caso exista coluna identity na tabela
           case when exists (SELECT * from sys.columns as CI
                               where CI.object_id = T.object_id
                                     and CI.is_identity = 1)
                     then 'set IDENTITY_INSERT ' 
                          + quotename (schema_name (T.schema_id)) 
                          + '.' + quotename (T.name) 
                          + ' on;' + char(13)+char(10)
                     else '' end
    
           -- tabela de destino          
           + 'INSERT into ' + quotename (schema_name (T.schema_id)) 
           + '.' + quotename (T.name) + ' with (tablock) (' 
           + stuff ((SELECT ', ' + quotename (C.name)
                       from sys.columns as C 
                       where C.object_id = T.object_id
                       order by C.name
                       for xml path(''), TYPE).value('.', 'varchar(max)'),
                    1, 2, '') 
           + ') '

    -- tabela de origem
    + 'SELECT ' + stuff ((SELECT ', ' + case when C.name = 'ID_fluig_tst' then quotename ('ID_fluig') else quotename (C.name) end from sys.columns as C where C.object_id = T.object_id order by C.name for xml path(''), TYPE).value('.', 'varchar(max)'), 1, 2, '') + ' from BDorigem.' + quotename (schema_name (T.schema_id)) + '.' + quotename (T.name) + '; '+ char(13)+char(10) -- desativa IDENTITY_INSERT, caso exista coluna identity na tabela + case when exists (SELECT * from sys.columns as CI where CI.object_id = T.object_id and CI.is_identity = 1) then 'set IDENTITY_INSERT ' + quotename (schema_name (T.schema_id)) + '.' + quotename (T.name) + ' off;' + char(13)+char(10) else '' end
           --
           + char(10) from sys.tables as T; PRINT @ComandoSQL; --EXECUTE (@ComandoSQL);

    Me lembro de já ter respondido tópico com solicitação semelhante, mas ainda não o encontrei.


    José Diz     Belo Horizonte, MG - Brasil     [ Separar em partes uma lista de valores (string split) ]


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

    • Marcado como Resposta Rubem Cerqueira quarta-feira, 29 de janeiro de 2020 14:54
    • Editado José Diz quinta-feira, 30 de janeiro de 2020 12:39
    quarta-feira, 29 de janeiro de 2020 11:32
  • Obrigado José.

    Estou com outro problema.

    Quando executo scripts faz inclusão de algumas tabelas mas no final gerar essa mensagem

    Query completed with erros


    quarta-feira, 29 de janeiro de 2020 14:57
  • Estou com outro problema.
    Quando executo scripts faz inclusão de algumas tabelas mas no final gerar essa mensagem

    Query completed with erros

    Rubem, essa é a única mensagem de erro exibida? Provavelmente na aba "Mensagens" há informações sobre os erros que ocorreram; poderia verificar?

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


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

    quarta-feira, 29 de janeiro de 2020 14:59
  • José, segue mensagem.

    Só aparece isso.



    • Editado Rubem Cerqueira quarta-feira, 29 de janeiro de 2020 20:42 Informei sem querer ip servidor sql
    quarta-feira, 29 de janeiro de 2020 16:50
  • Rubem,

    Na verdade a query foi completada mas não com 100% de acertos, existe algum comando Insert que estava apresentando errado, por isso esta sendo retornada esta mensagem para você.

    Quando trabalhamos com querys dinâmicas, este é um caso que pode acontecer, uma das partes do código apresentar alguma inconsistência ou falha, e dependendo da maneira que esta elaborado não conseguimos identificar inicialmente qual seria pois não estamos trabalhando com o conceito de execução delimitado por blocos de código, ou seja, o uso do comando GO dentro do SQL Server Management Studio acaba nos ajudando a identificar.

    Uma tentativa que não é das melhores seria ir executando os comandos Inserts aos poucos para tentar identificar em qual linha ou trecho pode estar acontecendo esta falha.

    Por acaso você chegou a utilizar a barra de rolagens existentes na guia de Mensagens para verificar se não existe nenhuma outra mensagem acima?


    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, 29 de janeiro de 2020 21:07
    Moderador
  • Rubem, no código #3 v8 o que observei de imediato é que faltou restringir a leitura na visão sys.tables somente às linhas de tabela. 

        ...   
        from sys.tables as T
        where T.type = 'U'
                  and T.is_ms_shipped <> 1;

    Entretanto, acho pouco provável que esta tenha sido a causa do erro. Estou revisando o código #3.


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


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

    • Editado José Diz quinta-feira, 30 de janeiro de 2020 11:19
    quarta-feira, 29 de janeiro de 2020 23:21
  • Rubem, criei outro código SQL para melhor controle sobre cada passo do roteiro de conversão de COLLATE. Ele é bem semelhante ao código #3, mas executa uma conversão de cada vez e retorna se houve erro. Ainda não o testei na bancada, mas espero que não tenha erros graves.

    O banco de dados de destino por enquanto é um banco de "testes", até que consiga a conversão completa?

    -- código #4
    -- Autor: José Diz / BH
    
    USE BDdestino;
    
    -- altera modelo de recuperação para simples
    ALTER DATABASE BDdestino set RECOVERY SIMPLE;
    BACKUP DATABASE BDdestino TO DISK = N'NUL'; -- declaração do cursor e variáveis para obter nomes das tabelas declare PorTabela cursor for SELECT name, schema_name (schema_id), object_id from sys.tables where type = 'U' and is_ms_shipped <> 1 order by schema_id, name for read only; declare @T_name sysname, @T_schema_name sysname, @T_object_id int; declare @ComandoSQL nvarchar(max), @erro int, @identity_on bit; -- OPEN PorTabela; -- obtém primeira tabela FETCH next from PorTabela into @T_name, @T_schema_name, @T_object_id; -- while @@FETCH_STATUS = 0 begin -- set @ComandoSQL= space(0); -- ativa IDENTITY_INSERT, caso exista coluna identity na tabela IF exists (SELECT * from sys.columns where object_id = @T_object_id and is_identity = 1) begin set @ComandoSQL+= 'set IDENTITY_INSERT ' + quotename (@T_schema_name) + '.' + quotename (@T_name) + ' on;' + char(13)+char(10); set @identity_on= 1; end else set @identity_on= 0; -- acrescenta tabela de destino no comando INSERT set @ComandoSQL+= 'INSERT into ' + quotename (@T_schema_name) + '.' + quotename (@T_name) + ' with (tablock) (' + stuff ((SELECT ', ' + quotename (C.name) from sys.columns as C where C.object_id = @T_object_id order by C.name for xml path(''), TYPE).value('.', 'varchar(max)'), 1, 2, '') + ') '; -- acrescenta tabela de origem no comando INSERT set @ComandoSQL+= 'SELECT ' + stuff ((SELECT ', ' + case when C.name = 'ID_fluig_tst' then quotename ('ID_fluig') else quotename (C.name) end from sys.columns as C where C.object_id = @T_object_id order by C.name for xml path(''), TYPE).value('.', 'varchar(max)'), 1, 2, '') + ' from BDorigem.' + quotename (@T_schema_name) + '.' + quotename (@T_name) + '; '+ char(13)+char(10); -- desativa IDENTITY_INSERT, caso tenha sido ativado IF @identity_on = 1 set @ComandoSQL+= 'set IDENTITY_INSERT ' + quotename (@T_schema_name)
    + '.' + quotename (@T_name) + ' off;' + char(13)+char(10); -- executa o comando SQL PRINT '---'; PRINT 'processando tabela ' + @T_schema_name + '.' + @T_name; --PRINT @ComandoSQL; set @erro= -1; EXECUTE @erro= sp_executesql @ComandoSQL; IF @erro <> 0 begin PRINT 'Ocorreu erro. Verifique'; PRINT @ComandoSQL; BREAK; end; -- CHECKPOINT; -- lê próxima tabela FETCH next from PorTabela into @T_name, @T_schema_name, @T_object_id; -- end; CLOSE PorTabela; DEALLOCATE PorTabela; -- retorna modelo de recuperação para COMPLETO ALTER DATABASE BDdestino set RECOVERY FULL;


    José Diz     Belo Horizonte, MG - Brasil     [ O Plano (de execução) Perfeito ]


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

    • Editado José Diz quinta-feira, 30 de janeiro de 2020 12:43
    • Marcado como Resposta Rubem Cerqueira quinta-feira, 30 de janeiro de 2020 12:48
    quinta-feira, 30 de janeiro de 2020 00:07
  • Olá José,  gerou esse erro conforme print.

    Essa tabela na origem é from fluig.[dbo].[FDN_fluig_SERVER] e tem mais tabelas desse tipo.

    No script 3 gerou consulta fiz essa alteração na mão.

    quinta-feira, 30 de janeiro de 2020 12:57
  • Olá José,  gerou esse erro conforme print.

    Essa tabela na origem é from fluig.[dbo].[FDN_fluig_SERVER] e tem mais tabelas desse tipo.

    No script 3 gerou consulta fiz essa alteração na mão.

    Ok, Rubem.

    O código #4 (bem como o #2 e o #3) foram construídos na premissa de que os bancos de dados (BDdestino e BDorigem) possuem a mesma estrutura. Pela mensagem de erro percebe-se que existe a tabela FDN_fluig1_SERVER no banco de dados de destino mas não existe no banco de dados de origem.

    O código #4 encerra o processamento no primeiro erro. Se quiser que o processamento continue, mesmo ocorrendo erros, basta retirar a linha com a instrução BREAK. Isto permite realizar uma análise geral dos erros e então efetuar as correções que não atendam à premissa.

       ...
    IF @erro <> 0 begin PRINT 'Ocorreu erro. Verifique'; PRINT @ComandoSQL; --BREAK; end;
    ...


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


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

    • Editado José Diz quinta-feira, 30 de janeiro de 2020 15:07
    • Marcado como Resposta Rubem Cerqueira quinta-feira, 30 de janeiro de 2020 20:19
    quinta-feira, 30 de janeiro de 2020 14:07
  • José/Junior, graças a  vocês migração de dados feito com sucesso!


    Abraço.

    quinta-feira, 30 de janeiro de 2020 20:20
  • José/Junior, graças a  vocês migração de dados feito com sucesso!


    Abraço.

    Rubem,

    Ótimo, que boa notícia, estamos sempre por aqui.


    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, 30 de janeiro de 2020 22:43
    Moderador