AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 54924
Accepted
Evan Carroll
Evan Carroll
Asked: 2013-12-13 10:11:37 +0800 CST2013-12-13 10:11:37 +0800 CST 2013-12-13 10:11:37 +0800 CST

Como identifico a(s) coluna(s) responsável(is) por "String ou dados binários seriam truncados".

  • 772

Estou gerando algumas consultas automagicamente com o código que escrevi para SELECT de um banco de dados Pg remoto e insiro em um banco de dados local do SQL Server. Porém, um deles está gerando este erro:

[Microsoft][ODBC SQL Server Driver][SQL Server]String ou dados binários seriam truncados. (SQL-22001) [estado era 22001 agora 01000]

[Microsoft][ODBC SQL Server Driver][SQL Server]A instrução foi encerrada. (SQL-01000) em .\insert.pl linha 106.

Como descubro qual coluna está gerando esse erro e não tem o comprimento da entrada? Existe uma maneira de fazer isso sem forçar a adivinhar todos os varchar?

sql-server sql-server-2008
  • 4 4 respostas
  • 56658 Views

4 respostas

  • Voted
  1. Best Answer
    Aaron Bertrand
    2013-12-13T11:17:51+08:002013-12-13T11:17:51+08:00

    Não, não está registrado em nenhum lugar. Vá votar e declarar seu caso de negócios; este é um na longa lista de coisas que devem ser corrigidas no SQL Server.

    Isso foi solicitado anos atrás no Connect (provavelmente primeiro no período de tempo do SQL Server 2000 ou 2005), depois novamente no novo sistema de feedback e agora foi entregue nas seguintes versões:

    • SQL Server 2019
    • SQL Server 2017 CU12
    • SQL Server 2016 SP2 CU6

    No primeiro CTP público do SQL Server 2019, ele aparece apenas sob o sinalizador de rastreamento 460. Isso parece meio secreto, mas foi publicado neste whitepaper da Microsoft . Este será o comportamento padrão (nenhum sinalizador de rastreamento necessário) daqui para frente, embora você possa controlar isso por meio de uma nova configuração no escopo do banco de dados VERBOSE_TRUNCATION_WARNINGS.

    Aqui está um exemplo:

    USE tempdb;
    GO
    CREATE TABLE dbo.x(a char(1));
    
    INSERT dbo.x(a) VALUES('foo');
    GO
    

    Resultado em todas as versões com suporte anteriores ao SQL Server 2019:

    Msg 8152, Level 16, State 30, Line 5
    String ou dados binários seriam truncados.
    A instrução foi encerrada.

    Agora, nos CTPs do SQL Server 2019, com o sinalizador de rastreamento habilitado:

    DBCC TRACEON(460);
    GO
    
    INSERT dbo.x(a) VALUES('foo');
    GO
    DROP TABLE dbo.x;
    DBCC TRACEOFF(460);
    

    O resultado mostra a tabela, a coluna e o valor ( truncado , não completo ):

    Msg 2628, Level 16, State 1, Line 11
    String ou dados binários seriam truncados na tabela 'tempdb.dbo.x', coluna 'a'. Valor truncado: 'f'.
    A instrução foi encerrada.

    Até que você possa migrar para uma versão/CU com suporte ou migrar para o Banco de Dados SQL do Azure, você pode alterar seu código "automagic" para realmente extrair o max_length de sys.columns, junto com o nome que você deve obter de qualquer maneira e, em seguida, aplicar LEFT(column, max_length)ou qualquer outra coisa O equivalente do PG é. Ou, já que isso significa apenas que você perderá dados silenciosamente, descubra quais colunas são incompatíveis e corrija as colunas de destino para que elas caibam em todos os dados da origem. Dado o acesso de metadados a ambos os sistemas e o fato de você já estar escrevendo uma consulta que deve corresponder automaticamente às colunas de origem -> de destino (caso contrário, esse erro dificilmente seria seu maior problema), você não deve fazer nenhuma força bruta adivinhando tudo.

    • 46
  2. Alexei
    2018-10-26T11:16:08+08:002018-10-26T11:16:08+08:00

    Finalmente , a Microsoft decidiu fornecer informações significativas para String or binary would be truncatediniciar no SQL Server 2016 SP2 CU, SQL Server 2017 CU12 e no SQL Server 2019.

    As informações agora incluem a coluna da tabela incorreta (nome totalmente qualificado) e o valor incorreto (truncado em 120 caracteres):

    Msg 2628, Level 16, State 1, Line x String ou dados binários seriam truncados na tabela 'TheDb.TheSchema.TheTable', coluna 'TheColumn'. Valor truncado: '...'. A instrução foi encerrada.

    • 3
  3. bubbassauro
    2015-10-10T09:44:26+08:002015-10-10T09:44:26+08:00

    Se você tiver acesso para executar o SQL Server Import and Export Wizard do SQL Server Management Studio (clique com o botão direito do mouse em banco de dados > Tarefas > Importar dados...), crie uma tarefa que importe do SQL Client usando sua consulta como fonte de dados para o destino tabela.

    Antes de executar a importação, você pode revisar o mapeamento de dados e ele informará quais colunas têm tipos de campo inconsistentes. E se você executar a tarefa de importação, ela informará quais colunas falharam na importação.

    Aviso de validação de amostra:

    Aviso 0x802092a7: Tarefa de Fluxo de Dados 1: O truncamento pode ocorrer devido à inserção de dados da coluna de fluxo de dados "NARRATIVE" com um comprimento de 316 na coluna de banco de dados "NARRATIVE" com um comprimento de 60. (Assistente de Importação e Exportação do SQL Server)

    • 2
  4. Evan Carroll
    2013-12-14T09:59:39+08:002013-12-14T09:59:39+08:00

    Por fim, não consegui encontrar uma maneira de obter as informações da coluna sem escrevê-las eu mesmo.

    Essa mensagem de erro foi gerada por DBD::ODBC, você também pode usar sys.columns (max_length)(só não sei como).

    Eu usei um código como este na minha lista de colunas para obter uma lista de matrizes com dois elementos, o COLUMN_NAMEe MAX_LENGTH(documentado em DBIcolumn_info() ).

    my @max_lengths = map [ @{$_->fetchall_arrayref->[0]}[3,6] ]
        , map $dbh_mssql->column_info('database', 'dbo', $dest_table, $_)
        , @col_mssql
    ;
    

    Então eu peguei as exceções INSERTe imprimi algo útil. Neste exemplo @$rowsão os dados enviados parasth->execute()

    if ($@) {
            warn "$@\n";
            for ( my $idx=0; $idx <= $#{ $row }; $idx++ ) {
                    Dumper {
                            maxlength => $max_lengths[$idx]->[1]
                            , name    => $max_lengths[$idx]->[0]
                            , length  => length( $row->[$idx] )
                            , content => $row->[$idx]
                    };
            }
            die;
    }
    

    Além disso, vote e vote na outra resposta

    • 1

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Como determinar se um Índice é necessário ou necessário

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve