Evitando o método de busca "Linha por linha" ao lidar com colunas LOB de origem

12

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.

Chris Pratt
fonte
3
Quando você os lançou explicitamente no sistema de origem para um tamanho não-máximo, isso estava em um fluxo de dados existente ou você criou um novo ou pelo menos um novo componente de origem para ele? Quando você fornece uma consulta com os mesmos nomes de coluna e apenas tipos mais finos, algumas vezes isso não é registrado como uma alteração, para que o editor não inicie um processo de coleta de metadados (o que pode ser caro). Além disso, um varchar (max) vai ser tratado como um LOB para um SSIS fluxo de dados e que pode ferir agilebi.com/jwelch/2010/05/11/...
billinkc
No componente de fonte de dados ODBC, você tem a opção de selecionar uma tabela ou usar uma consulta. É aí que estou fazendo a transmissão: em uma consulta personalizada. Mencionei 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 para varchar(max); no entanto, lancei algumas colunas para varchar(4000), apenas por segurança.
Chris Pratt

Respostas:

3

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.

Chris Pratt
fonte
3

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.

ceci
fonte
0

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.

insira a descrição da imagem aqui

Carbon 4horse
fonte
0

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).

Shatabdi Das Chowdhury
fonte