2009-05-29 16 views
5

Bir csv dosyam var ve bunu 2005 veya 2008 sql düzeyindeki bir tabloya aktarmam gerekiyor. Csv içindeki sütun adları ve sayıları tablo sütun adlarından farklıdır ve sayın. Csv bir ';' ile bölünmüştür. .csv dosyasını 2005 veya 2008'e almak için bcp'yi kullanın.

Örnek

CSV FILEcontents: BCP ile aktarırken

FirstName;LastName;Country;Age 
Roger;Mouthout;Belgium;55 

SQL Kişi Tablo

Columns: FName,LName,Country 
+0

bcp.exe'ye gittiniz mi? – gbn

+0

Bu dünya bu dosyayı bir CSV (Virgülle Ayrılmış Değerler) dosyası yapan nedir? –

cevap

9

Ben geçici bir tablo oluşturmak istiyorum, toplu yeni tabloya seçin sürü eklemek neyi Geçici tabloya ihtiyacın var.

şey

gibi
CREATE TABLE dbo.TempImport 
(
    FirstName varchar(255), 
    LastName varchar(255), 
    Country varchar(255), 
    Age varchar(255) 
) 
GO 
BULK INSERT dbo.TempImport FROM 'PathToMyTextFile' WITH (FIELDTERMINATOR = ';', ROWTERMINATOR = '\n') 
GO 
INSERT INTO dbo.ExistingTable 
(
    FName, 
    LName, 
    Country 
) 
SELECT FirstName, 
     LastName, 
     Country 
FROM  dbo.TempImport 
GO 
DROP TABLE dbo.TempImport 
GO 
Şimdi BULK INSERT veya OPENROWSET ile bunun gibi XML formatı dosyaları kullanmayı tercih
+6

Soru başlığı, çoğu durumda doğru cevap olsa da, BCP aracının nasıl kullanıldığına ilişkin toplu yükleme değil, yığın eki, bcp aracının sahip olmadığı satır ve alan sayısına ilişkin birkaç sınırlama sunar. – bpatrao

+0

Açıkçası oldukça uzun zaman önce ilk olarak, soru başlığı bcp'den bahsedebilir, ancak soru içeriği basitçe nasıl içe aktarılacağını sorar ve ikinci olarak BCP afaik –

+0

Hi Dan'da bulunmayan BULK INSERT'de satır veya alan sınırlaması yoktur. ! Resmi Microsoft belgelerini (http://msdn.microsoft.com/en-us/library/ms188365.aspx) işaretlerseniz açıkça belirtir "BULK INSERT ile bir biçim dosyası kullanırken, yalnızca 1024 alana kadar belirtebilirsiniz. Bu, bir tabloda izin verilen en fazla sütun sayısıyla aynıdır, 1024'ten fazla alan içeren bir veri dosyasıyla BULK INSERT kullanırsanız, BULK INSERT, 4822 hatasını üretir. Bcp yardımcı programı bu sınırlamalara sahip değildir, bu nedenle veri dosyaları için 1024'ten fazla alan içeren, bcp komutunu kullanın. " Bunun küçük bir sorun olduğunu biliyorum, ancak herkesi bilgilendirmek için :) – bpatrao

8

Bir biçim dosyası kullanabilirsiniz:

için bir biçim dosyası yaratın tablo:

bcp [table_name] format nul -f [format_file_name.fmt] -c -T 



9.0 
4 
1  SQLCHAR  0  100  ","  1  FName    SQL_Latin1_General_CP1_CI_AS 
2  SQLCHAR  0  100  ","  2  LName    SQL_Latin1_General_CP1_CI_AS 
3  SQLCHAR  0  100  ","  3  Country   SQL_Latin1_General_CP1_CI_AS 
4  SQLCHAR  0  100  "\r\n" 0  Age    SQL_Latin1_General_CP1_CI_AS 

İçe aktarma dosyasını düzenleyin. Hile, atlamak istediğiniz alan için bir kukla satır eklemek ve sunucu sütunu sırasına göre bir '0' eklemektir.

Sonra, bu biçim dosyası ve seperatör, bu biçim dosyası kullanarak InputFile belirterek veri almak:

bcp [table_name] in [data_file_name] -t , -f [format_file_name.fmt] -T 
3

şu şekildedir:

<?xml version="1.0"?> 
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<RECORD> 
    <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="|" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="37"/> 
    <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="41"/> 
    <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="17"/> 
    <FIELD ID="5" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="10" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
</RECORD> 
<ROW> 
    <COLUMN SOURCE="1" NAME="i" xsi:type="SQLCHAR"/> 
    <COLUMN SOURCE="2" NAME="j" xsi:type="SQLUNIQUEID"/> 
    <COLUMN SOURCE="3" NAME="k" xsi:type="SQLNUMERIC" PRECISION="18" SCALE="0"/> 
    <COLUMN SOURCE="4" NAME="l" xsi:type="SQLBINARY"/> 
    <COLUMN SOURCE="5" NAME="m" xsi:type="SQLVARYCHAR"/> 
</ROW> 
</BCPFORMAT> 

Sonra sunucu tarafı BULK INSERT komutunu kullanabilirsiniz: Alternatif olarak, 'uçuş sırasında' verisini değiştirmek isterseniz, alternatif olarak aşağıdakileri kullanabilirsiniz:

INSERT foo(i, j,k) 
SELECT foo_delimited.i, foo_delimited.j, foo_delimited.k * 2 
OPENROWSET(BULK 'foo', 
        FORMATFILE= 'foo.xml') 
     AS foo_delimited 
+0

XML'in doğru şekilde oluşturulmasını sağlayamıyorum. Yanıtı düzenlerseniz ham XML'i görebilirsiniz :-( –

İlgili konular