Eu tenho uma fonte de banco de dados PostgreSQL (ODBC) herdada que estou tentando migrar para o novo esquema do SQL Server usando o SSIS. Estou recebendo um aviso dizendo:
O método de busca 'Linha por linha' é imposto porque a tabela possui colunas LOB. O conteúdo da coluna é LOB
O problema é que nenhuma coluna precisa realmente ser LOBs. Existem alguns tipos de texto, mas que podem caber facilmente em um varchar (máx). Ainda mais estranho, porém, a maioria já é varchars, mas parece que algo sobre varchar (128) está sendo tratado como se fosse um LOB (em propriedades antecipadas, o tipo de dados é DT_NTEXT).
Eu tentei executar um comando SQL manual em que converti explicitamente todos os tipos de string para um varchar de tamanho apropriado na instrução select, e eles ainda estão sendo definidos como DT_NTEXT na fonte ODBC.
Eu não sou um DBA, então é perfeitamente possível que eu esteja fazendo algo realmente estúpido. Gostaria apenas de saber a melhor maneira de garantir que os tipos acabem como varchars para que eu possa buscar em lote. Alguma ideia?
Caso isso importe, estou usando o SSIS-BI 2014 no Visual Studio 2013.
fonte
varchar(max)
apenas como uma abreviação para dizer que os dados da coluna pode caber dentro do tamanho máximo varchar, que é por volta de 4000, para fins de SSIS, eu acho. Na verdade, não estou lançando nada paravarchar(max)
; no entanto, lancei algumas colunas paravarchar(4000)
, apenas por segurança.Respostas:
Aparentemente, isso se resume ao SSIS tratando qualquer varchar maior que 128 como NTEXT. Não sei por que. No entanto, posso acessar as propriedades avançadas da fonte ODBC e alterar os tipos novamente para algo como DT_WSTR. O que parece funcionar na maior parte.
No entanto, determinei que algumas das tabelas com as quais estou lidando na verdade carregam mais de 4000 bytes em algumas de suas colunas TEXT, então, infelizmente, tenho que deixar essas colunas como DT_NTEXT para impedir o truncamento (o SSIS não permitirá você define um tipo DT_WSTR com mais de 4000 bytes). Suponho que, nessas instâncias, estou apenas preso à busca linha por linha, mas pelo menos consegui consertar algumas tabelas.
fonte
Usei a Conversão de dados para o varchar maior que 128 como NTEXT, mas o que removeu o erro para mim acabou sendo o conjunto Validar dados externos para Falso.
fonte
Esta solução funcionou para mim:
Eu removi o erro alterando o parâmetro Max Varchar na propriedade de fonte de dados. Vá para o gerenciador de conexões. Selecione a opção de construção ao lado da cadeia de conexão. Clique no botão de conexão para acessar mais opções. Altere o valor do Max Varchar.
fonte
No meu caso, a fonte é o Filemaker ODBC, que também trata o texto longo como tipo de dados LOB. Meu pacote costumava travar por muito tempo devido à extrema diminuição no desempenho do método de busca Row by Row é imposta porque a tabela possui colunas LOB. Assim, durante a implantação, o tempo limite era excedido após um longo período de tempo e, eventualmente, falha.
Estou compartilhando a solução real que funcionou como um encanto para mim. Um dia que vale mais de 30k de extração de dados do tipo LOB levou aproximadamente 10 minutos para mim:
Baixe o DefaultBufferMaxRows para 1 e aumente o DefaultBufferSize para o máximo, ou seja, 100 MB. Em seguida, altere o DSN ODBC de origem, marcando a opção 'tratar texto como varchar longo'. E mapeie os tipos de dados da origem para o destino (sem nenhuma alteração no editor avançado na origem).
fonte