Banco de Dados

30 out, 2018

Adeus “String or binary data would be truncated”

Publicidade

Fala, pessoal!

Com o lançamento do SQL Server 2019 vieram diversas novidades, mas gostaria de destacar uma, pois já sofri muito com esse erro. Quem já sofreu também sabe o quanto é difícil e vai adorar essa novidade!

Vamos ao cenário: irei criar um exemplo bem simples, mas você vai se identificar bastante.

CREATE TABLE TB_DADOS
(
CAMPO1 VARCHAR(10),
CAMPO2 VARCHAR(10),
CAMPO3 VARCHAR(10),
CAMPO4 VARCHAR(10),
CAMPO5 VARCHAR(10),
CAMPO6 VARCHAR(10),
CAMPO7 VARCHAR(10),
CAMPO8 VARCHAR(10),
CAMPO9 VARCHAR(10),
CAMPO10 VARCHAR(10),
CAMPO11 VARCHAR(10),
CAMPO12 VARCHAR(10),
CAMPO13 VARCHAR(10),
CAMPO14 VARCHAR(10),
CAMPO15 VARCHAR(10),
CAMPO16 VARCHAR(10),
CAMPO17 VARCHAR(10),
CAMPO18 VARCHAR(10),
CAMPO19 VARCHAR(10),
CAMPO20 VARCHAR(10),
CAMPO21 TINYINT
)

Primeiro criamos uma tabela com 21 colunas (sempre com nomes bem padronizados), diga-se de passagem, com poucas colunas, mas pode levar para o seu mundo real, onde você deve ter tabelas com 200 colunas ou mais – diz aí nos comentários qual a maior quantidade de colunas que você já encontrou em uma tabela.

O próximo passo é alimentar nossa tabela com um comando de Insert:

INSERT INTO TB_DADOS VALUES(
‘RAFAEL’,
‘FELIPE’,
‘JUNIOR’,
‘REGINALDO’,
‘ANDRE’,
‘SANDRO’,
‘SAMUEL’,
‘JONATAS’,
‘BRUNA’,
‘ALICE’,
‘CAROLINE’,
‘CHRISTOFFER’,
‘JOAO’,
‘JOSEVALDO’,
‘ALEXSANDRA’,
‘SONIA’,
‘FLAVIO’,
‘FABRICIO’,
‘EDNER’,
‘RICK’,
10
)

No momento do Insert, recebemos a seguinte mensagem:

Msg 8152, Level 16, State 30, Line 27
String or binary data would be truncated.
The statement has been terminated.

A operação de Insert foi abortada, pois alguns dados seriam truncados – isso significa que algum texto informado nos valores estourou a capacidade do tipo de dados. No nosso caso, VARCHAR(10). Algum nome ultrapassou 10 caracteres, mas qual deles? Imagine uma lista com 200 nomes: como saber qual texto está estourando a capacidade do tipo de dados?

O exemplo acima está simples – ainda teríamos que analisar cada nome para ver qual deles tem mais de 10 caracteres: um trabalho árduo onde você pode gastar um bom tempo para encontrar. Eu acredito que muitos já sofreram e ainda sofrem com essa mensagem.

A partir do SQL Server 2019 teremos um tratamento para esse erro que facilitará muito nossas vidas.

Msg 2628, Level 16, State 1, Line 27
String or binary data would be truncated in table ‘db_SQL19.dbo.TB_DADOS’,
column ‘CAMPO12’. Truncated value: ‘CHRISTOFFE’.

Agora você receberá na mensagem com o nome da coluna que está recebendo os dados acima da capacidade do tipo de dados, junto com o valor truncado. Sensacional, não?

Como isso funciona?

Foi criado um novo registro no catálogo de mensagens do SQL Server.

select * from sys.messages where
message_id in(8152,2628) and language_id = 1033

A mensagem 8152 é a padrão e nos deu muita dor de cabeça nos últimos tempos. A nova mensagem criada é a 2628 “String or binary data would be truncated in table ‘%.*ls’, column ‘%.*ls’. Truncated value: ‘%.*ls’.”, essa que salvará muito do seu tempo.

Se você já instalou o SQL Server 2019 CTP (Community Technology Preview), e mesmo assim não consegue simular este caso, é porque, por default, ainda está a mensagem 8152. Provavelmente até a release final eles farão a troca para a 2628. Porém, você pode usar um Trace Flag para ativar a nova mensagem, TF 460.

Substituí a ID de mensagem 8152 de truncamento de dados pela ID de mensagem 2628. Para obter mais informações, confira este artigo do Suporte da Microsoft.

Observação: esse sinalizador de rastreamento se aplica à atualização cumulativa 12 do SQL Server 2017 (14.x) e builds posteriores.

Escopo: global ou sessão

Execute o comando abaixo para habilitar a Trace Flag e realize novamente os seus testes:

DBCC TRACEON(460,-1)

Essa nova mensagem também já está disponível no SQL Server 2017 no cumulative update 12:

Muito provável que também lançarão um cumulative update para o SQL Server 2016. Basta esperar, e enquanto isso, se você – assim como eu – tem diversos ambientes com SQL Server 2016 e versões inferiores (SQL Server 2000), terá que continuar sofrendo com a famosa “String or binary data would be truncated”.

É isso aí, pessoal. Espero que gostem desta novidade – estou até agora aplaudindo de pé.

Abraços e até a próxima!