سؤال

لدي ملف CSV وأحتاج إلى استيراده إلى جدول في SQL 2005 أو 2008. تختلف أسماء الأعمدة وعدد في CSV عن أسماء أعمدة الجدول والعناية. يتم تقسيم CSV من قبل "؛" وبعد

مثال

Filecontents CSV:

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

SQL شخص الجدول

Columns: FName,LName,Country
هل كانت مفيدة؟

المحلول

أقوم بإنشاء جدول مؤقت، السائبة إدراج الكثير، حدد في الجدول الجديد ما تحتاجه وإسقاط الجدول المؤقت.

شيء مثل

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

نصائح أخرى

يمكنك استخدام ملف تنسيق عند الاستيراد باستخدام BCP:

إنشاء ملف تنسيق وجدولك:

 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

تحرير ملف الاستيراد. تتمثل الخدعة في إضافة صف وهمية للحقل الذي تريد تخطيه وإضافة "0" كترتيب عمود الخادم.

ثم قم باستيراد البيانات باستخدام ملف التنسيق هذا، وتحديد InputFile، وملف التنسيق هذا والتمول:

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

أنا أفضل الآن استخدام ملفات تنسيق XML مثل هذا مع إدراج السائبة أو OpenRowset:

<?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>

ثم يمكنك استخدام الأمر Insert Bulk Side Side كما يلي:

BULK INSERT foo FROM '\\mydomain.com\bar\bletch' WITH (FORMATFILE='foo.xml', ERRORFILE='foo.errors',  FIRSTROW = 1, BATCHSIZE=10000)

بدلا من ذلك، إذا كنت ترغب في تعديل البيانات "أثناء الرحلة"، يمكنك استخدام

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

للحصول على معلومات، مع نفس الهيكل، يمكنك استخدام هذا النوع من العبارات:

bcp schema.Table in "/Samples/AdventureWorksDW/DimCurrency.csv" \
    -S db.url \
    -d databaseName \ 
    -U userName \
    -P pwd  \
    -t ; `# The field separator ` \
    -c  `# Insert as character and doesn't ask the data type`  \ 
    -q `# With quote -- seems to be mandatory` 

يرى مثال

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top