Estou gerando algumas consultas automagicamente com o código que escrevi para SELECT de um banco de dados Pg remoto e insiro em um banco de dados local do SQL Server. Porém, um deles está gerando este erro:
[Microsoft][ODBC SQL Server Driver][SQL Server]String ou dados binários seriam truncados. (SQL-22001) [estado era 22001 agora 01000]
[Microsoft][ODBC SQL Server Driver][SQL Server]A instrução foi encerrada. (SQL-01000) em .\insert.pl linha 106.
Como descubro qual coluna está gerando esse erro e não tem o comprimento da entrada? Existe uma maneira de fazer isso sem forçar a adivinhar todos os varchar
?
Não, não está registrado em nenhum lugar. Vá votar e declarar seu caso de negócios; este é um na longa lista de coisas que devem ser corrigidas no SQL Server.Isso foi solicitado anos atrás no Connect (provavelmente primeiro no período de tempo do SQL Server 2000 ou 2005), depois novamente no novo sistema de feedback e agora foi entregue nas seguintes versões:
No primeiro CTP público do SQL Server 2019, ele aparece apenas sob o sinalizador de rastreamento 460. Isso parece meio secreto, mas foi publicado neste whitepaper da Microsoft . Este será o comportamento padrão (nenhum sinalizador de rastreamento necessário) daqui para frente, embora você possa controlar isso por meio de uma nova configuração no escopo do banco de dados
VERBOSE_TRUNCATION_WARNINGS
.Aqui está um exemplo:
Resultado em todas as versões com suporte anteriores ao SQL Server 2019:
Agora, nos CTPs do SQL Server 2019, com o sinalizador de rastreamento habilitado:
O resultado mostra a tabela, a coluna e o valor ( truncado , não completo ):
Até que você possa migrar para uma versão/CU com suporte ou migrar para o Banco de Dados SQL do Azure, você pode alterar seu código "automagic" para realmente extrair o max_length de
sys.columns
, junto com o nome que você deve obter de qualquer maneira e, em seguida, aplicarLEFT(column, max_length)
ou qualquer outra coisa O equivalente do PG é. Ou, já que isso significa apenas que você perderá dados silenciosamente, descubra quais colunas são incompatíveis e corrija as colunas de destino para que elas caibam em todos os dados da origem. Dado o acesso de metadados a ambos os sistemas e o fato de você já estar escrevendo uma consulta que deve corresponder automaticamente às colunas de origem -> de destino (caso contrário, esse erro dificilmente seria seu maior problema), você não deve fazer nenhuma força bruta adivinhando tudo.Finalmente , a Microsoft decidiu fornecer informações significativas para
String or binary would be truncated
iniciar no SQL Server 2016 SP2 CU, SQL Server 2017 CU12 e no SQL Server 2019.As informações agora incluem a coluna da tabela incorreta (nome totalmente qualificado) e o valor incorreto (truncado em 120 caracteres):
Se você tiver acesso para executar o SQL Server Import and Export Wizard do SQL Server Management Studio (clique com o botão direito do mouse em banco de dados > Tarefas > Importar dados...), crie uma tarefa que importe do SQL Client usando sua consulta como fonte de dados para o destino tabela.
Antes de executar a importação, você pode revisar o mapeamento de dados e ele informará quais colunas têm tipos de campo inconsistentes. E se você executar a tarefa de importação, ela informará quais colunas falharam na importação.
Aviso de validação de amostra:
Por fim, não consegui encontrar uma maneira de obter as informações da coluna sem escrevê-las eu mesmo.
Essa mensagem de erro foi gerada por
DBD::ODBC
, você também pode usarsys.columns (max_length)
(só não sei como).Eu usei um código como este na minha lista de colunas para obter uma lista de matrizes com dois elementos, o
COLUMN_NAME
eMAX_LENGTH
(documentado em DBIcolumn_info()
).Então eu peguei as exceções
INSERT
e imprimi algo útil. Neste exemplo@$row
são os dados enviados parasth->execute()
Além disso, vote e vote na outra resposta