استخدم BCP لاستيراد ملف CSV إلى SQL 2005 أو 2008
-
06-09-2019 - |
سؤال
لدي ملف 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`
يرى مثال