No SQL Server Management Studio (SSMS) 2008 R2, desejo importar um CSV não formatado corretamente para uma tabela de banco de dados. Eu estava tentando usar o assistente em <database name>
-> Tasks
-> Import Data
.
Diferenças do "padrão" CSV
- valores nulos são representados por um espaço entre vírgulas
- alguns campos têm vírgulas no meio deles e não estão entre aspas
- há uma vírgula terminal em todas as linhas, exceto na linha de cabeçalho (WTF??)
Acabei resolvendo esses problemas manualmente editando o CSV antes da importação. O problema 2 foi corrigido substituindo vírgulas por traços para as 4 famílias de valores de células que estavam causando isso. Problema 3 Eu resolvi com uma pesquisa e substituição para essas vírgulas terminais. Problema 1, que era um problema para campos numéricos, também com pesquisa e substituição , ,
-> ,,
.
Quando meu arquivo finalmente foi importado corretamente, os valores nulos foram substituídos por zeros, embora eu tivesse permitido valores nulos nas definições de campo.
Minha pergunta básica: existe uma maneira de alterar o código para CAST
/ CONVERT
operações durante uma importação do SSMS? A única etapa em que consegui chegar ao código SQL foi nas definições de campo da tabela criada (de Select Source Tables and Views
-> Edit Mappings
-> Edit SQL
- que estava disponível se e somente se eu não tivesse alterado o nome da tabela de destino na Select Source Tables
página), mas isso foi apenas para a CREATE TABLE
definição e não abordou o processo de importação. Realmente parece-me que devo permitir que uma string de espaço de um único caractere seja convertida em um valor nulo quando convertida em um número (em vez disso, o assistente falha e informa que um valor está fora dos limites). Além disso, a string nula certamente deve ser convertida para o valor inteiro nulo, em vez de 0.
Posso salvar um pacote SSIS, mas não estava claro para mim como editar e executá-lo para permitir o que quero fazer. Existe um arquivo de modelo em algum lugar que eu possa editar para permitir que strings nulas sejam convertidas em valores inteiros nulos (como algo aqui .... )? Existe uma maneira de usar partes do assistente de importação para gerar código tSQL? Em vez disso, devo usar uma BULK INSERT
instrução em vez do assistente?
O assistente de Importação/Exportação cria um pacote SSIS nos bastidores, mas o pacote que o assistente cria executa apenas o E e L de ETL (Extrair, Transformar, Carregar). O que você está procurando é T porque precisava transformar esses dados estranhos em algo mais gerenciável.
Para a linha de cabeçalho estranha, você sempre pode especificar que não há linha de cabeçalho e o gerenciador de conexões deve pular N linhas.
Infelizmente, não há muito o que fazer sobre a própria análise quando há delimitadores embutidos. Logicamente, você pode olhar e ver que Kansas City, MO era todo um campo, mas o analisador é simplista e quebra a string no delimitador, exibindo um caractere de escape.
Para espaços não vazios, a maneira do assistente de Importação-Exportação seria importar para uma tabela de todas as colunas varchar e, em seguida, escrever uma consulta de extração executando qualquer mágica preferida para transformá-la em NULL
NULLIF(RTRIM(MyCol), '') AS MyCol
Notas aleatórias para futuros leitores
Se você estiver em 2005 ou 2008, a única maneira de obter o editor SSIS, BIDS (Business Intelligence Design Studio) é ter uma cópia da mídia de instalação do SQL Server. 2012+ A Microsoft permite o download e a instalação da edição SQL Server Data Tools-BI sem a necessidade de uma instalação do SQL Server.
O assistente de importação/exportação está disponível em todas as edições do SQL Server, incluindo o Express, mas a limitação aqui é que você não pode salvar o pacote SSIS gerado se estiver usando o Express. Todas as outras versões funcionam bem.