SQL Server Bulk Insert
-
05-07-2019 - |
Pergunta
Eu quero importar um arquivo de texto de uma coluna em uma das minhas tabelas sql. O arquivo é apenas uma lista de palavrões.
Eu escrevi o seguinte TSQL para fazer isso
BULK INSERT SwearWords
FROM 'c:\swears.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
No entanto, os erros com final unexapected de arquivo. O im mesa de importação para é apenas um campo de identidade seguido por um campo nvarchar que deseja inserir o texto. Ele funciona muito bem se eu adicionar no arquivo de texto "1", para o início da eveyr linha, eu assumo isso é porque SQL se à procura de 2 campos. Existe alguma maneira de contornar isso?
Graças
Solução
Você precisa usar FORMATFILE para isso. Consulte BULK INSERT .
FORMATFILE [= 'format_file_path']
Especifica o caminho completo de um formato Arquivo. Um arquivo de formato descreve os dados arquivo que contém respostas armazenados criado utilizando o utilitário BCP sobre o mesma tabela ou vista. O arquivo de formato deve ser utilizado nos casos em que:
* The data file contains greater or fewer columns than the table or view. * The columns are in a different order. * The column delimiters vary. * There are other changes in the data format. Format files are usually created by using the bcp utility and modified with a text editor as needed. For more information, see bcp Utility.
Para obter informações mais detalhadas, consulte Usando Format arquivos .
Outras dicas
Isto é descrito em livros na linha para INSERT BULK sob o argumento de KEEPIDENTITY. Aqui está o que diz
KEEPIDENTITY Especifica que os valores para uma coluna de identidade estão presentes no arquivo importado. Se KEEPIDENTITY não é dado, os valores de identidade para esta coluna no arquivo de dados importados são ignorados, e SQL Server atribui automaticamente valores exclusivos com base nos valores de semente e de incremento especificados durante a criação da tabela. Se o arquivo de dados não contém valores para a coluna de identidade na tabela ou exibição, use um arquivo de formato para especificar que a coluna de identidade na tabela ou exibição deve ser ignorada durante a importação de dados; SQL Server atribui automaticamente valores exclusivos para a coluna
Então, use um arquivo de formato ou fornecer um valor fictício e certifique-se de não usar o argumento KEEPIDENTITY
Além disso, você pode criar um ponto de vista sobre a sua mesa baseado apenas na coluna nvarchar, e depois BULK INSERT em sua vista. Esta é uma maneira muito limpo de utilizar BULK INSERT.
Desta forma, você não precisa se preocupar com sua coluna de identidade, ou a criação de um arquivo de formato.
Sua declaração BULK INSERT deve ficar assim:
BULK INSERT vw_SwearWords FROM 'c:\swearwords.txt' WITH (ROWTERMINATOR = '\n')
Você precisa ter certeza de que a estrutura do seu arquivo de texto eo jogo de mesa - se a tabela tem dois campos, então você terá que fornecer dois campos / colunas no arquivo de texto, bem
.Desde a primeira coluna na tabela de SQL é um campo de identidade, você pode fornecer qualquer valor que você quer -., Mas você tem que ter um valor lá, eu não acho que há alguma maneira de contornar isso
Marc
Verifique a última linha tem CR LF (\ r \ n) /. isso é, por vezes, o problema, algumas outras vezes um retorno de carro extra é no final do arquivo. Você pode verificar isso com um editor hexadecimal.
Você pode remover a coluna de identidade e colocá-lo de volta quando você está feito. Alternativamente, se que as quebras de seus relacionamentos de banco de dados, você poderia fazer a importação usando DTS ou SSIS se é uma vez fora de importação - um controlo mais granular de mexer com colunas
No SQL Server 2008 eu achei mais fácil simplesmente criar um arquivo contendo uma grande quantidade de inserções como assim, e colar isso em janela de consulta do Management Studio, em vez de lutar com a obtenção do arquivo de formato e volume inserção permissões de arquivo apenas para a direita :
USE YourDB
GO
INSERT INTO MyTable (FirstCol, SecondCol)
VALUES ('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)