erro, string ou dados binários seriam truncados ao tentar inserir

Estou executando o arquivo data.bat com as seguintes linhas:

Rem Tis batch file will populate tables cd\program files\Microsoft SQL Server\MSSQL osql -U sa -P Password -d MyBusiness -ic:\data.sql 

O conteúdo do arquivo data.sql é:

  insert Customers (CustomerID, CompanyName, Phone) Values('101','Southwinds','19126602729') 

Existem mais 8 linhas semelhantes para adicionar registros.

Quando executo isso com start > run > cmd > c:\data.bat , recebo esta mensagem de erro:

 1>2>3>4>5>.... Msg 8152, Level 16, State 4, Server SP1001, Line 1 string or binary data would be truncated.       

Além disso, eu sou um novato, obviamente, mas o que Level # , e state # significa, e como eu procuro mensagens de erro como a acima: 8152?

Da resposta de @ gmmastros

Sempre que você vir a mensagem ….

 string or binary data would be truncated 

Pense para si mesmo … O campo não é grande o suficiente para manter meus dados.

Verifique a estrutura da tabela para a tabela de clientes. Acho que você descobrirá que o tamanho de um ou mais campos NÃO é grande o suficiente para conter os dados que você está tentando inserir. Por exemplo, se o campo Telefone for um campo varchar (8) e você tentar colocar 11 caracteres nele, você receberá este erro.

Em uma das instruções INSERT você está tentando inserir uma string muito longa em uma coluna de string ( varchar ou nvarchar ).

Se não for óbvio qual INSERT é o ofensor com um simples olhar para o script, você pode contar as <1 row affected> que ocorrem antes da mensagem de erro. O número obtido mais um dá o número da declaração. No seu caso, parece ser o segundo INSERT que produz o erro.

Eu tive esse problema, embora o comprimento dos dados foi menor que o comprimento do campo. Descobriu-se que o problema era ter outra tabela de log (para trilha de auditoria), preenchida por um gatilho na tabela principal, onde o tamanho da coluna também tinha que ser alterado.

Alguns de seus dados não podem caber na coluna do database (pequena). Não é fácil encontrar o que está errado. Se você usar C # e Linq2Sql, você pode listar o campo que seria truncado:

Primeiro crie uma class auxiliar:

 public class SqlTruncationExceptionWithDetails : ArgumentOutOfRangeException { public SqlTruncationExceptionWithDetails(System.Data.SqlClient.SqlException inner, DataContext context) : base(inner.Message + " " + GetSqlTruncationExceptionWithDetailsString(context)) { } ///  /// PArt of code from following link /// http://stackoverflow.com/questions/3666954/string-or-binary-data-would-be-truncated-linq-exception-cant-find-which-fiel ///  ///  ///  static string GetSqlTruncationExceptionWithDetailsString(DataContext context) { StringBuilder sb = new StringBuilder(); foreach (object update in context.GetChangeSet().Updates) { FindLongStrings(update, sb); } foreach (object insert in context.GetChangeSet().Inserts) { FindLongStrings(insert, sb); } return sb.ToString(); } public static void FindLongStrings(object testObject, StringBuilder sb) { foreach (var propInfo in testObject.GetType().GetProperties()) { foreach (System.Data.Linq.Mapping.ColumnAttribute attribute in propInfo.GetCustomAttributes(typeof(System.Data.Linq.Mapping.ColumnAttribute), true)) { if (attribute.DbType.ToLower().Contains("varchar")) { string dbType = attribute.DbType.ToLower(); int numberStartIndex = dbType.IndexOf("varchar(") + 8; int numberEndIndex = dbType.IndexOf(")", numberStartIndex); string lengthString = dbType.Substring(numberStartIndex, (numberEndIndex - numberStartIndex)); int maxLength = 0; int.TryParse(lengthString, out maxLength); string currentValue = (string)propInfo.GetValue(testObject, null); if (!string.IsNullOrEmpty(currentValue) && maxLength != 0 && currentValue.Length > maxLength) { //string is too long sb.AppendLine(testObject.GetType().Name + "." + propInfo.Name + " " + currentValue + " Max: " + maxLength); } } } } } } 

Em seguida, prepare o wrapper para SubmitChanges:

 public static class DataContextExtensions { public static void SubmitChangesWithDetailException(this DataContext dataContext) { //http://stackoverflow.com/questions/3666954/string-or-binary-data-would-be-truncated-linq-exception-cant-find-which-fiel try { //this can failed on data truncation dataContext.SubmitChanges(); } catch (SqlException sqlException) //when (sqlException.Message == "String or binary data would be truncated.") { if (sqlException.Message == "String or binary data would be truncated.") //only for EN windows - if you are running different window language, invoke the sqlException.getMessage on thread with EN culture throw new SqlTruncationExceptionWithDetails(sqlException, dataContext); else throw; } } } 

Preparar o manipulador de exceção global e os detalhes do truncamento de log:

 protected void Application_Error(object sender, EventArgs e) { Exception ex = Server.GetLastError(); string message = ex.Message; //TODO - log to file } 

Finalmente use o código:

 Datamodel.SubmitChangesWithDetailException(); 

no sql server você pode usar SET ANSI_WARNINGS OFF assim:

  using (SqlConnection conn = new SqlConnection("Data Source=XRAYGOAT\\SQLEXPRESS;Initial Catalog='Healthy Care';Integrated Security=True")) { conn.Open(); using (var trans = conn.BeginTransaction()) { try { using cmd = new SqlCommand("", conn, trans)) { cmd.CommandText = "SET ANSI_WARNINGS OFF"; cmd.ExecuteNonQuery(); cmd.CommandText = "YOUR INSERT HERE"; cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); cmd.CommandText = "SET ANSI_WARNINGS ON"; cmd.ExecuteNonQuery(); trans.Commit(); } } catch (Exception) { trans.Rollback(); } } conn.Close(); } 

Esse problema também ocorreu na superfície do aplicativo da web. Eventualmente descobri que a mesma mensagem de erro vem da instrução SQL update na tabela específica.

Por fim, descobri que a definição da coluna na (s) tabela (s) de histórico relacionada não mapeou o tamanho da coluna da tabela original dos tipos nvarchar em alguns casos específicos.

Espero que esta dica ajude alguém também ..;)

Outra situação em que você pode obter esse erro é o seguinte:

Eu tive o mesmo erro e o motivo foi que em uma instrução INSERT que recebeu dados de uma UNION, a ordem das colunas era diferente da tabela original. Se você alterar a ordem em # table3 para a, b, c, irá corrigir o erro.

 select a, b, c into #table1 from #table0 insert into #table1 select a, b, c from #table2 union select a, c, b from #table3 

Eu tive o mesmo problema. O tamanho da minha coluna era muito curto. O que você pode fazer é aumentar o tamanho ou encurtar o texto que deseja colocar no database.

Só quero contribuir com informações adicionais: Eu tive o mesmo problema e foi por causa do campo não foi grande o suficiente para os dados de input e este segmento me ajudou a resolvê-lo (a resposta top esclarece tudo).

MAS é muito importante saber quais são as possíveis razões que podem causar isso.

No meu caso eu estava criando a tabela com um campo assim:

 Select '' as Period, * From Transactions Into #NewTable 

Portanto, o campo “Período” tinha um comprimento Zero e fazia com que as operações de Inserção falhassem. Eu mudei para “XXXXXX” que é o comprimento dos dados de input e agora funcionou corretamente (porque o campo agora tinha um lentgh de 6).

Espero que isso ajude alguém com o mesmo problema 🙂

Quando eu tentei executar o meu procedimento armazenado, tive o mesmo problema, porque o tamanho da coluna que eu preciso para adicionar alguns dados é menor do que os dados que eu quero adicionar. Você pode aumentar o tamanho do tipo de dados da coluna ou reduzir o tamanho dos dados.

Outra situação, em que esse erro pode ocorrer é no SQL Server Management Studio. Se você tiver campos “text” ou “ntext” em sua tabela, não importa o tipo de campo que você está atualizando (por exemplo, bit ou inteiro). Parece que o Studio não carrega campos “ntext” inteiros e também atualiza TODOS os campos em vez do campo modificado. Para resolver o problema, exclua os campos “text” ou “ntext” da consulta no Management Studio