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:
A mensagem 8152, nível 16, estado 14, procedimento DSP_Procedure, linha 1075 String ou dados binários seria truncada.
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 dificulta a identificação de qual campo está causando o erro de truncamento.
Talvez eu possa comentar blocos de campos de cada vez para que o SP insira apenas 100 campos por vez e execute o SP 6 ou 7 vezes diferentes até que eu possa pelo menos diminuir para um grupo de 100 campos que conterá o campo que está causando o erro de truncamento.
Como alternativa, 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 maior que o esperado. ..
Estou usando o SQL Server 2014.
Alguma alternativa mais fácil?
fonte
Respostas:
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.fonte
Infelizmente, você encontrou um "recurso" bastante antigo . Existe 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 padrão é, como você imaginou,
select into...
seguida pela comparação dos metadados da tabela. Outra possibilidade é a busca binária na coluna incorreta, mas isso também é trabalho manual. Existem alguns hacks para comparação de metadados, mas não existe uma solução simples e elegante. Talvez algumas ferramentas de terceiros ajudem, mas não estou ciente disso.fonte
O uso do (QUERYTRACEON 460) não funcionou para mim ao colocá-lo no final da minha consulta.
Eu o liguei no nível do banco de dados e funcionou:
Porém, certifique-se de desativá-lo depois de encontrar e corrigir o problema, não o deixe ligado!
fonte