none
Erro no BCP IN RRS feed

  • Pergunta

  • Estamos fazendo um BCP In de tabela que contem coluna text (SQL 2005 sp4 Enterprise edition) porem estamos recebendo a seguinte mensagem 

    NULL

    Starting copy...
    SQLState = 22005, NativeError = 0
    Error = [Microsoft][SQL Native Client]Invalid character value for cast specification
    5 rows sent to SQL Server. Total sent: 5
    SQLState = 22005, NativeError = 0
    Error = [Microsoft][SQL Native Client]Invalid character value for cast specification
    NULL
    6 rows copied.
    Network packet size (bytes): 4096
    Clock Time (ms.) Total     : 1      Average : (6000.00 rows per sec.)
    NULL

    Segue o comando para criacao da tabela, insercao de dados, e comandos bcp utilizados

    Obrigada!

    --Criando tabela origem

    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    SET ANSI_PADDING ON
    GO

    CREATE TABLE [dbo].[testeorigem](
    [a] [int] NOT NULL,
    [b] [int] IDENTITY(1,1) NOT NULL,
    [c] [varchar](10) NOT NULL,
    [d] [text] NOT NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

    GO

    SET ANSI_PADDING OFF
    GO

    USE [dbtrace]
    GO

    ALTER TABLE [dbo].[testeorigem] ADD  CONSTRAINT [pk_testeorigem] PRIMARY KEY CLUSTERED 
    (
    [a] ASC,
    [b] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    GO

    --Criacao da tabela destino. A unica alteracao é a coluna b que passa de int para bigint.

    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    SET ANSI_PADDING ON
    GO

    CREATE TABLE [dbo].[testedestino](
    [a] [int] NOT NULL,
    [b] [bigint] IDENTITY(1,1) NOT NULL,
    [c] [varchar](10) NOT NULL,
    [d] [text] NOT NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

    GO

    SET ANSI_PADDING OFF
    GO

    -- Insercao dos dados na tabela origem

    set identity_insert testeorigem on
    go
    insert into testeorigem (a,b,c,d) values (1,1,'a','primeira linha')
    insert into testeorigem (a,b,c,d) values (1,6,'a','linha 1 6 a teste linha 6')
    insert into testeorigem (a,b,c,d) values (1,19,'a','linha 1 19 a')
    insert into testeorigem (a,b,c,d) values (1,20,'a','linha 1 20 a   %
    teste linha 20')
    insert into testeorigem (a,b,c,d) values (1,21,'a','linha 1 21 a')
    insert into testeorigem (a,b,c,d) values (2,1,'a','linha 100 100 a                                                                            
    TESTE                          
    TESTE%

    TESTE $$$$$$$$$$$$$$$$$$$$$$$$


    FIM')
    insert into testeorigem (a,b,c,d) values (3,1,'a','linha 3')                                                   
    insert into testeorigem (a,b,c,d) values (3,2,'a','linha 2 ')                                                   
    set identity_insert testeorigem off
    go

    -- Comando bcp out utilizado

    exec master..xp_cmdshell 'bcp dbteste.dbo.testeorigem out "F:\testeorigem.txt" -T -E -c -Sxxx -b5  -eF:\testeorigem.err'

    --Retorno da bcp out

    NULL
    Starting copy...
    NULL
    8 rows copied.
    Network packet size (bytes): 4096
    Clock Time (ms.) Total     : 15     Average : (533.33 rows per sec.)
    NULL

    -- comando bcp in utilizado

    exec master..xp_cmdshell 'bcp dbteste.dbo.testedestino in "F:\testeorigem.txt" -T -E -c -Sxxx -b5 -eF:\testeestino.err'

    -- Saida com erro anexo acima

    Obs: A tabela original contem 120 gb de dados.. por isso precisamos fazer via bcp o export para alterar a coluna de int para bigint (coluna que é identity e parte do indice composto da PK)

    sábado, 15 de novembro de 2014 12:27

Respostas

  • Deleted
    segunda-feira, 17 de novembro de 2014 16:44
  • Durval, obrigada pelo retorno

    Truncamos a tabela destino antes de iniciar o SSIS e a opcao do identity tb estava habilitada.

    Nesta tabela que é pequena o SSIS executa com sucesso, porém na nossa tabela em que estamos executando o procedimento, o log fica imenso mais de 1 Tb e não conclui logo precisamos utilizar o BCP

    Lembrando que estamos no SQL2005 com sp4

    Ja tentamos fazer a importacao dos dados atraves do insert com select mas montando um while..porém mesmo criando indice na tabela destino com a coluna b para conseguirmos colocar como limitador para podermos comitar de tempos em tempos o mesmo não utiliza o indice e acaba varrendo a tabela inteira a cada x linhas colocados como inicio e fim..

    Hiachu1,

    Utilize uma consulta para esta importação de tabela com paginação, deste modo você pode importar um lote de dados, efetuar o SHRINK do log e realizar uma nova importação com outro lote de dados sem perder nenhuma informação.

    Você deve mudar a opção para escrever a consulta:

    Depois basta você definir a consulta com a quantidade de registros que você pretende importar em cada lote e marcar a página. Segue duas consultas para facilitar a compreensão da paginação de dados em T-SQL:

    --Primeira carga
    SELECT A, B, C, D
    FROM testeorigem
    ORDER BY A
    OFFSET 0 ROWS
    FETCH NEXT 4 ROWS ONLY;
    GO
    
    --Segunda carga
    SELECT A, B, C, D
    FROM testeorigem
    ORDER BY A
    OFFSET 4 ROWS
    FETCH NEXT 4 ROWS ONLY;
    GO

    A cada lote finalizado, você reduz o tamanho de seu arquivo de log, segue um exemplo de script T-SQL:

    USE SeuBanco
    GO
    
    DBCC SHRINKFILE (SeuBanco_Log, 3);
    GO

    Para maiores informações veja:

    http://social.technet.microsoft.com/wiki/pt-br/contents/articles/23533.paginando-uma-consulta-com-sql-server.aspx

    http://msdn.microsoft.com/pt-br/library/ms189493.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    segunda-feira, 17 de novembro de 2014 11:11
    Moderador

Todas as Respostas

  • Deleted
    sábado, 15 de novembro de 2014 13:52
  • Haichu1,

    Obrigado por disponibilizar um script semelhante ao seu ambiente.

    O retorno do seu BCP parece que foi apenas "informativo", uma vez que ele indica ter inserido os 8 registros de sua tabela "testeorigem". Houve alguma perda quando você comparou os dados?

    Vamos lá, como alternativa, vou ainda insistir um pouco que você não precisa do BCP para esta tarefa, simplesmente porque a coluna text pode gerar problemas na exportação.

    Vou demonstrar o uso do "Import Data..." com seu script. Você deve ter ajustado em "Edit Mappings" para descartar a inclusão de dados anteriores e utilizar a inclusão da propriedade IDENTITY. Veja na imagem abaixo:

    Não realizei nenhum ajuste à seguir (apesar de que seria interessante no seu caso analisar o se a coluna "d" na tabela "testeorigem" tem o mesmo collation da coluna "d" na tabela "testedestino", isto pode ser um fator de falha).

    A seguir o processo foi finalizado com sucesso. Eu sei que isso não descarta uma verificação no seu "log" para identificar aproximadamente qual registro pode estar apresentando problema para esta migração de dados e também se existe espaço suficiente para alocação das instruções no arquivo de log e posteriormente para o respectivo FILEGROUP (.MDF ou .NDF), mas este é um processo simples e que funciona.

    Por favor, tente mais uma vez e caso ocorra outro erro indique a mensagem do log. Estamos aqui para ajudar você à concluir esta tarefa de migração (não importa o meio: BCP, Import, DTSX, ...).

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    sábado, 15 de novembro de 2014 13:53
    Moderador
  • Haichu1,

    A única coisa que me deixa intrigado é a mensagem:

    Invalid character value for cast specification
    NULL

    Isto porque tanto na estrutura da tabela "origem" como no "destino" a coluna "d" é "NOT NULL".

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    sábado, 15 de novembro de 2014 14:03
    Moderador
  • Deleted
    sábado, 15 de novembro de 2014 14:57
  • Durval, obrigada pelo retorno

    Truncamos a tabela destino antes de iniciar o SSIS e a opcao do identity tb estava habilitada.

    Nesta tabela que é pequena o SSIS executa com sucesso, porém na nossa tabela em que estamos executando o procedimento, o log fica imenso mais de 1 Tb e não conclui logo precisamos utilizar o BCP

    Lembrando que estamos no SQL2005 com sp4

    Ja tentamos fazer a importacao dos dados atraves do insert com select mas montando um while..porém mesmo criando indice na tabela destino com a coluna b para conseguirmos colocar como limitador para podermos comitar de tempos em tempos o mesmo não utiliza o indice e acaba varrendo a tabela inteira a cada x linhas colocados como inicio e fim..

    segunda-feira, 17 de novembro de 2014 01:38
  • Jose, o volume da tabela torna-se impossivel a utilizacao do alter table pois alocamos 1 Tb de log e mesmo assim houve estour na area de log pois o comando e processado numa unica transacao
    segunda-feira, 17 de novembro de 2014 01:42
  • Deleted
    segunda-feira, 17 de novembro de 2014 09:25
  • Durval, obrigada pelo retorno

    Truncamos a tabela destino antes de iniciar o SSIS e a opcao do identity tb estava habilitada.

    Nesta tabela que é pequena o SSIS executa com sucesso, porém na nossa tabela em que estamos executando o procedimento, o log fica imenso mais de 1 Tb e não conclui logo precisamos utilizar o BCP

    Lembrando que estamos no SQL2005 com sp4

    Ja tentamos fazer a importacao dos dados atraves do insert com select mas montando um while..porém mesmo criando indice na tabela destino com a coluna b para conseguirmos colocar como limitador para podermos comitar de tempos em tempos o mesmo não utiliza o indice e acaba varrendo a tabela inteira a cada x linhas colocados como inicio e fim..

    Hiachu1,

    Utilize uma consulta para esta importação de tabela com paginação, deste modo você pode importar um lote de dados, efetuar o SHRINK do log e realizar uma nova importação com outro lote de dados sem perder nenhuma informação.

    Você deve mudar a opção para escrever a consulta:

    Depois basta você definir a consulta com a quantidade de registros que você pretende importar em cada lote e marcar a página. Segue duas consultas para facilitar a compreensão da paginação de dados em T-SQL:

    --Primeira carga
    SELECT A, B, C, D
    FROM testeorigem
    ORDER BY A
    OFFSET 0 ROWS
    FETCH NEXT 4 ROWS ONLY;
    GO
    
    --Segunda carga
    SELECT A, B, C, D
    FROM testeorigem
    ORDER BY A
    OFFSET 4 ROWS
    FETCH NEXT 4 ROWS ONLY;
    GO

    A cada lote finalizado, você reduz o tamanho de seu arquivo de log, segue um exemplo de script T-SQL:

    USE SeuBanco
    GO
    
    DBCC SHRINKFILE (SeuBanco_Log, 3);
    GO

    Para maiores informações veja:

    http://social.technet.microsoft.com/wiki/pt-br/contents/articles/23533.paginando-uma-consulta-com-sql-server.aspx

    http://msdn.microsoft.com/pt-br/library/ms189493.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    segunda-feira, 17 de novembro de 2014 11:11
    Moderador
  • Deleted
    segunda-feira, 17 de novembro de 2014 16:44