none
upload from excl RRS feed

  • שאלה

  • שלום

    אני מנסה להכניס נתונים מתוך אקסל בDTS SQL 2000ומקבל הודעת שגיה שפורמט של שדה מסוים לא מתאים,השדות האלה משתנים כול פעם שאני מנסה שוב.זו הטבלה שלי:


    CREATE TABLE [dbo].[LOC] (
     [Loc] [char] (10) COLLATE Hebrew_CI_AS NOT NULL ,
     [Cube] [float] NOT NULL ,
     [Length] [float] NOT NULL ,
     [Width] [float] NOT NULL ,
     [Height] [float] NOT NULL ,
     [LocationType] [char] (10) COLLATE Hebrew_CI_AS NOT NULL ,
     [LocationFlag] [char] (10) COLLATE Hebrew_CI_AS NOT NULL ,
     [LocationHandling] [char] (10) COLLATE Hebrew_CI_AS NOT NULL ,
     [LocationCategory] [char] (10) COLLATE Hebrew_CI_AS NOT NULL ,
     [LogicalLocation] [char] (18) COLLATE Hebrew_CI_AS NOT NULL ,
     [CubicCapacity] [float] NOT NULL ,
     [WeightCapacity] [float] NOT NULL ,
     [Status] [char] (10) COLLATE Hebrew_CI_AS NOT NULL ,
     [LoseId] [char] (1) COLLATE Hebrew_CI_AS NOT NULL ,
     [Facility] [char] (5) COLLATE Hebrew_CI_AS NOT NULL ,
     [ABC] [char] (1) COLLATE Hebrew_CI_AS NOT NULL ,
     [PickZone] [char] (10) COLLATE Hebrew_CI_AS NOT NULL ,
     [PutawayZone] [char] (10) COLLATE Hebrew_CI_AS NOT NULL ,
     [SectionKey] [char] (10) COLLATE Hebrew_CI_AS NOT NULL ,
     [PickMethod] [char] (1) COLLATE Hebrew_CI_AS NOT NULL ,
     [CommingleSku] [char] (1) COLLATE Hebrew_CI_AS NOT NULL ,
     [CommingleLot] [char] (1) COLLATE Hebrew_CI_AS NOT NULL ,
     [LocLevel] [int] NOT NULL ,
     [Xcoord] [int] NOT NULL ,
     [Ycoord] [int] NOT NULL ,
     [Zcoord] [int] NOT NULL ,
     [TrafficCop] [char] (1) COLLATE Hebrew_CI_AS NULL ,
     [ArchiveCop] [char] (1) COLLATE Hebrew_CI_AS NULL
    ) ON [PRIMARY]
    GO

     

    יום ראשון 20 נובמבר 2011 13:58

תשובות

  • הי,

    הייתי ממליץ לך להגדיר את כל השדות כמחרוזת ולבצע המרת data types בזמן הטעינה.

    במידה ושדה מסויים מוגדר כ- Int ובגליון לא יהיה ערך מספרי אזי הוא יתורגם לטקסט, מחרוזת ריקה, והטעינה תכשל.

    בנוסף כל השדות צריכים להיות מוגדרים כ- Null, ולידציות תבצע לאחר טעינה. 

    מה שאני עושה בתהליכי טעינה מקבצים זה כך:

    1. מקבל ערכים לשדות טקסט.

    2. ניקוי מחרוזות ריקות.

    3. ולידציות.

    4. כתיבת תהליך המיגציה שכולל: שליפת הנתונים, המרת Data types וטעינה.

    בהצלחה 


    אסף שלם
    • נערך על-ידי Assaf_Shalem יום ראשון 20 נובמבר 2011 14:27
    • הוצע כתשובה על-ידי itaigitt יום ראשון 20 נובמבר 2011 14:55
    • סומן כתשובה על-ידי Ami Levin יום חמישי 22 דצמבר 2011 13:13
    יום ראשון 20 נובמבר 2011 14:26
  • כמה נקודות נוספות/שונות

    1. בניגוד לקבצי טקסט אקסל כולל גם סוג נתונים. ברירת המחדל היא לשמור נתונים במצב "כללי" ולכן נוצרת הבעיה אבל אם כבר בקובץ האקסל מגדירים את השדה בצורה ספציפית (למשל כ"מספר") אז אין שום בעיה בייבוא ואין צורך בשינוי סוג הנתונים ברמת השאילתה של הייבוא (אם כי זה תמיד טוב ומבטיח את המצב)

    2. בניגוד לאסף אני אישית מעדיף את סדר הפעולות הבא בייבוא מאסל:

    א. טיוב הנתונים באקסל (קל מאוד לעבוד עם אקסל לטיוב נתונים על ידי סידור מיידי של הנתונים לפי שדות, הסתרה של נתונים בעזרת FILTER ואם צריך גם כתיבת מאקרו קטן, כמו כן ביצוע פעולה בשורה אחת לחיצה עליה פעמיים גוררת ביצוע שלה על כל הרשומות ועוד)
    ב. ייבוא הנתונים בצורה מסודרת כבר לטבלה הסופית (מוגדרת כאמור כבר עם השדות הנכונים הסופיים ולא כטקסט בלבד)

    * למעשה הרבה פעמים ייצאתי נתונים מ SQL לאקסל רק לשם טיוב שלהם מכיוון שהטיוב באקסל הרבה יותר נוח לטעמי.

    3. אם יש לך אפשרות של כתיבת קוד ב דוטנט אז ייבוא הנתונים בדוטנט מאפשר לך לייבא אותם כפרמטרים ואז כבר בזמן קריאת הנתונים לפני הגישה למסד הנתונים מבוצע אימות של סוג הנתון וככה ניתן בקלות לבצע את הפעולה של אם הנתון טיוב תמשיך לטעון אותו ואם הוא לא טוב אז תרשום בקובץ לוג אז הרשומה כפי שהיא. בסיום התהליך ישאר לך רק לעבור על הקובץ אקסל החדש של הלוג ולטייב נתונים שלא עברו בפעם הקודמת (פעולה נוחה למצב שאתה מבצע ייבוא נתונים בצורה קבועה למשל כל זמן מסויים)

    4. אחת הבעיות שנתקלתי בה קשורה לעברית. הדות שלך במסד הנתונים מוגדרים כעברית אבל באקסל לא בהכרח שכך ההגדרה ונוצרת אי-תאימות...

    לא סיפרת לנו כיצד אתה מבצע את הייבוא וחבל...

    אם אתה לא עובד עם bcp אז אני ממליץ לנסות בצורה זו. הגמישות גדולה יותר משימוש ישיר ב OPENROWSET והוא הרבה יותר נוח לעבודה בעברית לדעתי. במקרה זה תוכל להגדיר למשל לדלג על רשומות שלא הצלחת לייבא וכמו במקרה הקודם שהצגתי תוכל בשלב שני לעבור רק על הרשומות שלא ייובאו ולבצע להם טיוב נתונים ולייבא אותם שוב.

    אפשרות אחרת:
    בזמן הייבוא של הנתונים בשאילתה לבדוק אם הנתון מתאים לסוג שאתה מייבא ואם לא אז להכניס נתון כלשהו של ברירת מחדל שתמיד תוכל לאתר אותו אחר בשאילתה פשוטה וככה לאתר את כל הנתונים החסרים שלא הוכנסו טוב.
    ז"א הרעיון בשאילתה עצה כבר לבדוק את התקינות של הנתון שמייבאים ולא להגיע למצב של נפילת השאילתה אלא פשוט לעבוד עם IF ו 2 אפשרויות (כן = טוען נתון, לא = טוען נתון חילופי). בצורה זו לא תגיע למצב של נפילה באמצע בשל שגיאה קטנה בנתון בודד.

    ** אני מחזיק למשל ספרייה של DLL שכתבתי בשם IsX. הכוונה למתודות פשוטות שמקבלות אובייקט גנרי (כל סוג אובייקט) ומחזירות True/False בהתאם לבדיקה שהרצנו. למשל בתוך הספרייה IsX יש לי מתודה IsNumber שבודקת אם הנתון מספרי. שימוש ב DLL אפשר לעשות כמובן ישירות ב SQL מגרסה 2005. בזמן הייבוא ניתן פשוט לעטוף כל נתון בפונקציה של CLR או בפונקציה של SQL שגם תבצע את הדיקה לגבי תקינות הנתון וגם תחליף אותו בנתון אחר אם אינו תקין או אפילו תבצע לו כבר טיוב כלשהו.


    signature
    • נערך על-ידי pituachMVP, Editor יום שני 21 נובמבר 2011 05:39
    • סומן כתשובה על-ידי Ami Levin יום חמישי 22 דצמבר 2011 13:13
    יום שני 21 נובמבר 2011 05:38
    מנחה דיון

כל התגובות

  • הי,

    הייתי ממליץ לך להגדיר את כל השדות כמחרוזת ולבצע המרת data types בזמן הטעינה.

    במידה ושדה מסויים מוגדר כ- Int ובגליון לא יהיה ערך מספרי אזי הוא יתורגם לטקסט, מחרוזת ריקה, והטעינה תכשל.

    בנוסף כל השדות צריכים להיות מוגדרים כ- Null, ולידציות תבצע לאחר טעינה. 

    מה שאני עושה בתהליכי טעינה מקבצים זה כך:

    1. מקבל ערכים לשדות טקסט.

    2. ניקוי מחרוזות ריקות.

    3. ולידציות.

    4. כתיבת תהליך המיגציה שכולל: שליפת הנתונים, המרת Data types וטעינה.

    בהצלחה 


    אסף שלם
    • נערך על-ידי Assaf_Shalem יום ראשון 20 נובמבר 2011 14:27
    • הוצע כתשובה על-ידי itaigitt יום ראשון 20 נובמבר 2011 14:55
    • סומן כתשובה על-ידי Ami Levin יום חמישי 22 דצמבר 2011 13:13
    יום ראשון 20 נובמבר 2011 14:26
  • כמה נקודות נוספות/שונות

    1. בניגוד לקבצי טקסט אקסל כולל גם סוג נתונים. ברירת המחדל היא לשמור נתונים במצב "כללי" ולכן נוצרת הבעיה אבל אם כבר בקובץ האקסל מגדירים את השדה בצורה ספציפית (למשל כ"מספר") אז אין שום בעיה בייבוא ואין צורך בשינוי סוג הנתונים ברמת השאילתה של הייבוא (אם כי זה תמיד טוב ומבטיח את המצב)

    2. בניגוד לאסף אני אישית מעדיף את סדר הפעולות הבא בייבוא מאסל:

    א. טיוב הנתונים באקסל (קל מאוד לעבוד עם אקסל לטיוב נתונים על ידי סידור מיידי של הנתונים לפי שדות, הסתרה של נתונים בעזרת FILTER ואם צריך גם כתיבת מאקרו קטן, כמו כן ביצוע פעולה בשורה אחת לחיצה עליה פעמיים גוררת ביצוע שלה על כל הרשומות ועוד)
    ב. ייבוא הנתונים בצורה מסודרת כבר לטבלה הסופית (מוגדרת כאמור כבר עם השדות הנכונים הסופיים ולא כטקסט בלבד)

    * למעשה הרבה פעמים ייצאתי נתונים מ SQL לאקסל רק לשם טיוב שלהם מכיוון שהטיוב באקסל הרבה יותר נוח לטעמי.

    3. אם יש לך אפשרות של כתיבת קוד ב דוטנט אז ייבוא הנתונים בדוטנט מאפשר לך לייבא אותם כפרמטרים ואז כבר בזמן קריאת הנתונים לפני הגישה למסד הנתונים מבוצע אימות של סוג הנתון וככה ניתן בקלות לבצע את הפעולה של אם הנתון טיוב תמשיך לטעון אותו ואם הוא לא טוב אז תרשום בקובץ לוג אז הרשומה כפי שהיא. בסיום התהליך ישאר לך רק לעבור על הקובץ אקסל החדש של הלוג ולטייב נתונים שלא עברו בפעם הקודמת (פעולה נוחה למצב שאתה מבצע ייבוא נתונים בצורה קבועה למשל כל זמן מסויים)

    4. אחת הבעיות שנתקלתי בה קשורה לעברית. הדות שלך במסד הנתונים מוגדרים כעברית אבל באקסל לא בהכרח שכך ההגדרה ונוצרת אי-תאימות...

    לא סיפרת לנו כיצד אתה מבצע את הייבוא וחבל...

    אם אתה לא עובד עם bcp אז אני ממליץ לנסות בצורה זו. הגמישות גדולה יותר משימוש ישיר ב OPENROWSET והוא הרבה יותר נוח לעבודה בעברית לדעתי. במקרה זה תוכל להגדיר למשל לדלג על רשומות שלא הצלחת לייבא וכמו במקרה הקודם שהצגתי תוכל בשלב שני לעבור רק על הרשומות שלא ייובאו ולבצע להם טיוב נתונים ולייבא אותם שוב.

    אפשרות אחרת:
    בזמן הייבוא של הנתונים בשאילתה לבדוק אם הנתון מתאים לסוג שאתה מייבא ואם לא אז להכניס נתון כלשהו של ברירת מחדל שתמיד תוכל לאתר אותו אחר בשאילתה פשוטה וככה לאתר את כל הנתונים החסרים שלא הוכנסו טוב.
    ז"א הרעיון בשאילתה עצה כבר לבדוק את התקינות של הנתון שמייבאים ולא להגיע למצב של נפילת השאילתה אלא פשוט לעבוד עם IF ו 2 אפשרויות (כן = טוען נתון, לא = טוען נתון חילופי). בצורה זו לא תגיע למצב של נפילה באמצע בשל שגיאה קטנה בנתון בודד.

    ** אני מחזיק למשל ספרייה של DLL שכתבתי בשם IsX. הכוונה למתודות פשוטות שמקבלות אובייקט גנרי (כל סוג אובייקט) ומחזירות True/False בהתאם לבדיקה שהרצנו. למשל בתוך הספרייה IsX יש לי מתודה IsNumber שבודקת אם הנתון מספרי. שימוש ב DLL אפשר לעשות כמובן ישירות ב SQL מגרסה 2005. בזמן הייבוא ניתן פשוט לעטוף כל נתון בפונקציה של CLR או בפונקציה של SQL שגם תבצע את הדיקה לגבי תקינות הנתון וגם תחליף אותו בנתון אחר אם אינו תקין או אפילו תבצע לו כבר טיוב כלשהו.


    signature
    • נערך על-ידי pituachMVP, Editor יום שני 21 נובמבר 2011 05:39
    • סומן כתשובה על-ידי Ami Levin יום חמישי 22 דצמבר 2011 13:13
    יום שני 21 נובמבר 2011 05:38
    מנחה דיון
  • תודה רבה.

    אני מייבא DTS .אנסה BCP

    יום שני 21 נובמבר 2011 07:13