Estou envolvido em um projeto de migração de dados. Estou recebendo o seguinte erro ao tentar inserir dados de uma tabela em outra tabela (SQL Server 2005):
A mensagem 8152, nível 16, estado 13, linha 1,
seqüência de caracteres ou dados binários seria truncada.
As colunas de dados de origem correspondem ao tipo de dados e estão dentro das definições de comprimento das colunas da tabela de destino; portanto, não sei o que pode estar causando esse erro.
sql-server
tsql
sql-server-2005
migration
data-migration
Jim Evans
fonte
fonte
Respostas:
Você precisará publicar as definições da tabela para as tabelas de origem e destino para que possamos descobrir onde está o problema, mas a linha inferior é que uma de suas colunas na tabela de origem é maior que as colunas de destino . Pode ser que você esteja alterando os formatos de uma maneira que não conhecia. O modelo de banco de dados do qual você está saindo é importante para descobrir isso também.
fonte
Como já foi dito, um dos tipos de dados de suas colunas na tabela de origem é maior que as colunas de destino.
Uma solução simples é simplesmente desativar o aviso e permitir que o truncamento ocorra. Portanto, se você estiver recebendo esse erro, mas com certeza é aceitável que os dados em seu banco de dados / tabela antigo sejam truncados (cortados no tamanho), basta fazer o seguinte;
Como acima, lembre-se sempre de ativar os avisos novamente depois. Eu espero que isso ajude.
fonte
O problema é bastante simples: uma ou mais das colunas na consulta de origem contêm dados que excedem o comprimento da coluna de destino. Uma solução simples seria levar sua consulta de origem e executar
Max(Len( source col ))
em cada coluna. Ou seja,Em seguida, compare esses comprimentos com os comprimentos de tipo de dados na sua tabela de destino. Pelo menos um excede o comprimento da coluna de destino.
Se você está absolutamente certo de que esse não deve ser o caso e não se importa se não for o caso , outra solução é converter à força as colunas de consulta de origem no comprimento de destino (o que truncará quaisquer dados que sejam muito longos):
fonte
O SQL Server 2019 finalmente retornará uma mensagem de erro mais significativa.
Para habilitar um novo comportamento, você precisa usar
DBCC TRACEON(460)
. Novo texto de erro desys.messages
:Dados de cadeia ou binários seriam truncados: substituindo o erro infame 8152
O SQL Server 2017 CU12 também oferece suporte a esse recurso.
Melhoria: Substituição opcional da mensagem "Seqüência de caracteres ou dados binários seriam truncados" com informações estendidas no SQL Server 2017
db <> demo de violino
fonte
Um outro motivo potencial para isso é se você tiver uma configuração de valor padrão para uma coluna que exceda o comprimento da coluna. Parece que alguém tocou uma coluna com um comprimento de 5, mas o valor padrão excedeu o comprimento de 5. Isso me deixou maluco, enquanto eu tentava entender por que não estava funcionando em nenhuma inserção, mesmo se tudo o que eu estava inserindo fosse. uma única coluna com um número inteiro 1. Como o valor padrão no esquema da tabela tinha esse valor violador, ele estragou tudo - o que eu acho que nos leva à lição aprendida - evite ter tabelas com os valores padrão no esquema. :)
fonte
Para os outros, verifique também o procedimento armazenado . No meu caso, no meu procedimento armazenado,
CustomSearch
declarei acidentalmente que não há comprimento suficiente para minha coluna; portanto, quando inseri um grande volume de dados, recebi esse erro, mesmo tendo um grande comprimento no meu banco de dados. Acabei de alterar o comprimento da minha coluna na minha pesquisa personalizada, o erro desaparece. Isso é apenas para lembrar. Obrigado.fonte
Este pode ser um erro desafiador. Aqui estão algumas anotações feitas em https://connect.microsoft.com/SQLServer/feedback/details/339410/ procure pelo comentário de AmirCharania.
Ajustei a resposta dada pelo AmirCharania para os dados selecionados em uma tabela real, em vez de uma temporária. Primeiro selecione seu conjunto de dados em uma tabela de desenvolvimento e execute o seguinte:
fonte
Aqui está uma resposta um pouco diferente. Os nomes e os comprimentos das suas colunas podem corresponder, mas talvez você esteja especificando as colunas na ordem errada na sua instrução SELECT. Digamos que tableX e tableY tenham colunas com o mesmo nome, mas em ordem diferente
fonte
Hoje me deparei com esse problema e, na minha busca por uma resposta para esta mensagem de erro informativa mínima, também encontrei este link:
https://connect.microsoft.com/SQLServer/feedback/details/339410/please-fix-the-string-or-binary-data-would-be-truncated-message-to-give-the-column-name
Portanto, parece que a Microsoft não tem planos de expandir a mensagem de erro em breve.
Então eu me virei para outros meios.
Copiei os erros para o Excel:
(1 linha (s) afetada)
(1 linha (s) afetada)
(1 linha (s) afetada) Msg 8152, Nível 16, Estado 14, Linha 13 Seqüência de caracteres ou dados binários seriam truncados. A instrução foi encerrada.
(1 linha (s) afetada)
contei o número de linhas no excel, cheguei perto do contador de registros que causou o problema ... ajustei meu código de exportação para imprimir o SQL perto dele ... depois executei as inserções de 5 a 10 sql em torno do problema sql e conseguiu identificar o problema, ver a sequência que era muito longa, aumentar o tamanho dessa coluna e, em seguida, o grande arquivo de importação não teve problema.
Um pouco de um hack e uma solução alternativa, mas quando você sai com muito pouca escolha, você faz o que pode.
fonte
Sim, eu também estou enfrentando esse tipo de problema.
Aqui, mudei o tamanho do arquivo OBSERVAÇÕES de 500 para 1000
fonte
Vou adicionar outra causa possível desse erro, apenas porque ninguém o mencionou e isso pode ajudar uma pessoa futura (uma vez que o OP encontrou sua resposta). Se a tabela na qual você está inserindo tiver gatilhos, pode ser que o gatilho esteja gerando o erro. Vi isso acontecer quando as definições de campo da tabela foram alteradas, mas as tabelas de auditoria não.
fonte
Sim - "um litro em um pote de meio litro não vai". Eu não tive muita sorte (por qualquer motivo) com os vários SPs que as pessoas sugeriram, mas desde que as duas tabelas estejam no mesmo banco de dados (ou você pode colocá-las no mesmo banco de dados), você pode usar o Information_SCHEMA. COLUNAS para localizar os campos errantes, assim:
Isso permitirá que você role para cima e para baixo, comparando os comprimentos dos campos à medida que avança. As seções comentadas permitem que você veja (uma vez descomentado, obviamente) se existem incompatibilidades de tipo de dados ou mostre especificamente aquelas que diferem no comprimento do campo - porque eu sou muito preguiçoso para rolar - esteja ciente de que tudo está baseado na fonte nomes de colunas que correspondem aos do destino.
fonte
Eu estava usando a string vazia '' na criação da tabela e, em seguida, recebi o erro 'Msg 8152, String ou dados binários seriam truncados' na atualização subsequente. Isso estava acontecendo devido ao valor de atualização contendo 6 caracteres e sendo maior que a definição da coluna prevista. Eu usei o "ESPAÇO" para contornar isso apenas porque sabia que estaria atualizando em massa após a criação inicial dos dados, ou seja, a coluna não ficaria vazia por muito tempo.
TÃO GRANDE CAVEAT AQUI: Esta não é uma solução particularmente eficiente, mas é útil no caso em que você está reunindo um conjunto de dados, por exemplo, para solicitações pontuais de inteligência em que está criando uma tabela para mineração de dados, aplicando algum processamento / interpretação em massa e armazenar antes e depois dos resultados para posterior comparação / mineração. Esta é uma ocorrência frequente na minha linha de trabalho.
Você pode preencher inicialmente usando a palavra-chave SPACE, ou seja,
Atualizações subsequentes para "nome_da_coluna" de 10 caracteres ou menos (substitua conforme aplicável) serão permitidas sem causar erro truncado. Novamente, eu usaria isso apenas em cenários semelhantes aos descritos na minha ressalva.
fonte
Criei um procedimento armazenado que analisa uma tabela ou consulta de origem com várias características por coluna, entre as quais o comprimento mínimo (min_len) e o comprimento máximo (max_len).
Eu armazeno esse procedimento no banco de dados mestre para poder usá-lo em todos os bancos de dados da seguinte forma:
E a saída é:
column description constraint_type fk_table fk_column pos default null data_type length precision radix is_unique min_len max_len nulls blanks numerics distincts distinct_values remarks
id_individual NULL PRIMARY KEY NULL NULL 1 NULL NO int NULL 10 10 1 1 2 0 0 70 70 Many (70) unique,all numeric,
id_brand NULL NULL NULL NULL 2 NULL NO int NULL 10 10 0 1 1 0 0 70 2 2,3 same length,all numeric, guid NULL NULL NULL NULL 3 (newid()) NO uniqueidentifier NULL NULL NULL 1 36 36 0 0 0 70 Many (70) unique,same length,
customer_id NULL NULL NULL NULL 4 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
email NULL NULL NULL NULL 5 NULL YES varchar 100 NULL NULL 0 4 36 0 0 0 31 Many (31)
mobile NULL NULL NULL NULL 6 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
initials NULL NULL NULL NULL 7 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
title_short NULL NULL NULL NULL 8 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
title_long NULL NULL NULL NULL 9 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
firstname NULL NULL NULL NULL 10 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
lastname NULL NULL NULL NULL 11 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
address NULL NULL NULL NULL 12 NULL YES varchar 100 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
pc NULL NULL NULL NULL 13 NULL YES varchar 10 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
kixcode NULL NULL NULL NULL 14 NULL YES varchar 20 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
date_created NULL NULL NULL NULL 15 (getdate()) NO datetime NULL NULL NULL 1 19 19 0 0 0 70 Many (70) unique,same length,
created_by NULL NULL NULL NULL 16 (user_name()) NO varchar 50 NULL NULL 0 13 13 0 0 0 1 loyalz-public same length,
id_location_created NULL FOREIGN KEY location id_location 17 NULL YES int NULL 10 10 0 1 1 0 0 70 2 1,2 same length,all numeric, id_individual_type NULL FOREIGN KEY individual_type id_individual_type 18 NULL YES int NULL 10 10 0 NULL NULL 70 0 0 0 NULL all null,empty,
optin NULL NULL NULL NULL 19 NULL YES int NULL 10 10 0 1 1 39 0 31 2 0,1 same length,
fonte
sp_
prefixo para seus procedimentos armazenados. A Microsoft reservou esse prefixo para seu próprio uso (consulte Naming Stored Procedures ) e você corre o risco de um conflito de nome em algum momento no futuro. Também é ruim para o desempenho do procedimento armazenado . É melhor simplesmente evitarsp_
e usar outra coisa como prefixo - ou nenhum prefixo!Eu escrevi um procedimento útil de armazenamento para ajudar a identificar e resolver o problema de truncamento de texto (dados binários ou de seqüência de caracteres seriam truncados) quando a instrução INSERT SELECT é usada. Ele compara apenas os campos CHAR, VARCHAR, NCHAR E NVARCHAR e retorna um campo de avaliação por campo, no caso de ser a possível causa do erro.
CÓDIGO DE FUNÇÃO:
Por enquanto, suporta apenas os tipos de dados CHAR, VARCHAR, NCHAR e NVARCHAR . Você pode encontrar a última versão deste código no próximo link abaixo e nos ajudamos a melhorá-lo. GetFieldStringTruncate.sql
https://gist.github.com/jotapardo/210e85338f87507742701aa9d41cc51d
fonte
Se você estiver no SQL Server 2016-2017: para corrigi-lo, ative o sinalizador de rastreamento 460
e desative-o depois de:
fonte
fonte
isso também pode acontecer quando você não tem permissões adequadas
fonte
Eu tive uma questão semelhante. Eu estava copiando dados de uma tabela para uma tabela idêntica em tudo, menos no nome.
Eventualmente, eu joguei a tabela de origem em uma tabela temporária usando uma instrução SELECT INTO.
Comparei o esquema da tabela de origem à tabela temporária. Eu descobri que uma das colunas era
varchar(4000)
quando eu esperavavarchar(250)
.ATUALIZAÇÃO: A questão do varchar (4000) pode ser explicada aqui caso você esteja interessado:
Para Nvarchar (Max), estou recebendo apenas 4000 caracteres no TSQL?
Espero que isto ajude.
fonte
Este erro é gerado quando a coluna de uma tabela coloca restrição [principalmente comprimento]. . Por exemplo, se o esquema do banco de dados para a coluna myColumn for CHAR (2), quando sua chamada de qualquer aplicativo para inserir valor, você deve passar a String de comprimento dois.
O erro basicamente diz isso; A sequência de comprimento três e superior é inconsistente para ajustar-se à restrição de comprimento especificada pelo esquema do banco de dados. É por isso que o SQL Server avisa e lança erro de perda / truncamento de dados.
fonte
Por favor, tente o seguinte código:
fonte