קליטת קבצי טקסט לטבלה

29/06/2010

נתחיל מהמקרה הפשוט ביותר: נתון קובץ טקסט עם שמות עובדים אותם יש לקלוט, ונשמור אותו בתור C:\Tmp\TxtFile1.txt:

Avi
Batya
Carmel
Dana

ניצור טבלה מתאימה:

Use tempdb;

Go

If Object_Id('T_Tmp1') Is Not Null Drop Table T_Tmp1;

Go

Create Table T_Tmp1(Txt Varchar(Max));

Go

ונייבא את הנתונים מהקובץ לתוכה:

Bulk Insert T_Tmp1 From 'C:\Tmp\TxtFile1.txt';

Go

מה קורה אם בטבלה יש עוד עמודות מלבד זו שלתוכה יש לייבא את הנתונים?

ניצור טבלה שכוללת מלבד עמודה Txt כנ"ל גם עמודת מספור אוטומטי ועמודת תאריך (עם תאריך שוטף כברירת מחדל) שמתמלאות מאליהן:

If Object_Id('T_Tmp2') Is Not Null Drop Table T_Tmp2;

Go

Create Table T_Tmp2(Mone Int Identity,

                Txt Varchar(Max),

                Taarih DateTime Default Getdate());

Go

פתרון אפשרי יכול להיות יצירת View בעל עמודה אחת – Txt – שלתוכו ייובא הקובץ:

Create View V_Tmp As

Select Txt From T_Tmp2;

Go

Bulk Insert V_Tmp From 'C:\Tmp\TxtFile1.txt';

Go

כמובן שבפעמים הבאות אין צורך ליצור את ה-View מחדש..

פתרון חלופי יכול להוות שימוש בפקודת xp_cmdshell באופן הבא:

Insert Into T_Tmp2(Txt)

Exec xp_cmdshell 'Type C:\Tmp\TxtFile1.txt';

Go

כעת נפנה למקרה בו גם בקובץ הטקסט יש מספר עמודות: עמודת מספר אישי ועמודת שם עובד,

כדי ש"יהיה מעניין" נוסיף שורות רווח בין שורות הנתונים – אותן יש לפלטר,

ואת כל זה נשמור בתור C:\Tmp\TxtFile3.txt:

1,Avi

2,Batya

3,Carmel

4,Dana

לקובץ ניצור טבלה מתאימה שתכלול עמודות ID ו-Txt עבור הנתונים שבקובץ,

ועמודות Mone ו-Taarih שמתמלאות מאליהן כמו בדוגמאות הקודמות:

If Object_Id('T_Tmp3') Is Not Null Drop Table T_Tmp3;

Go

Create Table T_Tmp3(Mone Int Identity,

                ID Int,

                Txt Varchar(Max),

                Taarih DateTime Default Getdate());

Go

ליבוא הקובץ ניצור קובץ פורמט קבוע שיכלול מידע לגבי מבנה קובץ הנתונים (שאמור להשתנות בכל פעם),

ושנשמור אותו בתור C:\Tmp\TxtFile3.xml:

<?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="," MAX_LENGTH="10"/>

<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="8000"/>

</RECORD>

<ROW>

<COLUMN SOURCE="1" NAME="ID" xsi:type="SQLSMALLINT"/>

<COLUMN SOURCE="2" NAME="Txt" xsi:type="SQLNVARCHAR"/>

</ROW>

</BCPFORMAT>

ונקלוט את הקובץ כך:

Insert Into T_Tmp3(ID,Txt)

Select    ID,

        Txt

From    OpenRowset(Bulk 'C:\Tmp\TxtFile3.txt',FormatFile='C:\Tmp\TxtFile3.xml') T

Where    Txt Is Not Null;

Go

כדאי לשים לב שדרך זו – ללא פקודת ה-Insert לתוך הטבלה – יכולה להיות דרך טובה לשליפת נתונים מקבצי טקסט ישירות לדוחות,

או אפילו תוך ביצוע Join עם טבלאות אחרות.

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *