Eu tenho um procedimento armazenado que insere 650 campos em uma tabela. A inserção está falhando com um erro de truncamento.
É um simples
INSERT INTO
SELECT (a bunch of fields)
FROM (a bunch of tables)
Abaixo está a mensagem de erro:
Msg 8152, Level 16, State 14, Procedure DSP_Procedure, Line 1075 String ou dados binários seriam truncados.
Existe uma maneira rápida de identificar qual campo está causando o erro de truncamento?
O fato de a instrução select a ser inserida na tabela ter 650 campos torna difícil identificar qual campo está causando o erro de truncamento.
Estou pensando que talvez possa comentar blocos de campos por vez para que o SP insira apenas 100 campos por vez e depois execute o SP 6 ou 7 vezes diferentes até que eu possa pelo menos restringir a um grupo de 100 campos que conterá o campo que está causando o erro de truncamento.
Alternativamente, estou pensando que talvez eu possa apenas SELECT INTO
uma nova tabela e, em seguida, compare os comprimentos de dados na tabela versus os comprimentos de dados da tabela de destino que estou tentando inserir no meu SP para ver qual campo contém um comprimento de campo maior do que o esperado. ..
Estou usando o SQL Server 2014.
Alguma alternativa mais fácil?
Infelizmente, você encontrou um "recurso" bastante antigo . Há um tíquete do Connect aberto desde 2008 e, por quase dez anos, isso não foi significativo o suficiente para justificar uma correção.
A solução alternativa padrão é, como você imaginou,
select into...
seguida pela comparação de metadados da tabela. Outra possibilidade é a pesquisa binária na coluna incorreta, mas isso também é um trabalho manual. Existem alguns hacks para comparação de metadados, mas uma solução simples e elegante não existe. Talvez algumas ferramentas de terceiros possam ajudar, mas não estou ciente disso.Se você estiver no SQL Server 2016 (SP2, CU6 ou mais recente), uma opção é ativar o sinalizador de rastreamento 460, por exemplo
(QUERYTRACEON 460)
. A saída indicará a coluna e os dados incorretos.Veja este artigo para detalhes. https://www.brentozar.com/archive/2019/03/how-to-fix-the-error-string-or-binary-data-would-be-truncated/
Se você não se importa com o truncamento, pode usar
SET ANSI_WARNINGS OFF
para ignorar esse tipo de truncamento.Usar (QUERYTRACEON 460) não funcionou para mim ao colocá-lo no final da minha consulta.
Liguei no nível do banco de dados e funcionou:
Mas, certifique-se de desligá-lo depois de encontrar e corrigir o problema, não o deixe ligado!