none
Error converting data type RRS feed

  • שאלה

  • היי,

    אני נתקל הרבה בשגיאה הזו בשאילתות שאני מבצע לכן אשמח לקבל הסבר:

    1. ממה זה נגרם?  ברור לי למשל שאם אני מנסה לחכניס ערך של תאריך לתוך שדה int- אז אני אקבל שגיאה, אבל אם אני מבצע select *   into table1 from table 2

    אז למעשה אני יוצר טבלה ולא מכניס לטבלה קיימת.

    2. איך אני יודע איפה הבעיה? אם אני מריץ שאילתה שמכניסה נתונים לטבלה ורק אחרי 20 שניות היא נופלת- איך אני אמור לדעת איזה רשומה גרמה לבעיה ( בהנחה שזו בעיה של טיוב נתונים)

    3. איך אפשר להימנע מזה??? איך אני יכול להכניס נתונים לטבלה שגם אם טיפוסי הנתונים לא זהים- זה ייכנס בכל זאת?

    תודה מראש.

    יום שני 09 יולי 2012 14:08

תשובות

  • שלום,

    1. בגדול הודעת השגיאה הנ"ל תתקבל כש SQL  לא יצליח להמיר Data type אחד לשני .

    2. לדעתי השגיאה מכילה בד"כ מידע  נוסף שעשוי לעלות על זהות הרשומה הבעייתית

    3. איפיון נכון של data types  ושימוש ב Cast  במידת הצורך  לטיוב הנתונים 

    http://msdn.microsoft.com/en-us/library/ms187928.aspx

    מקווה שעזרתי,

    נועם

    • סומן כתשובה על-ידי eran2b יום שלישי 10 יולי 2012 09:12
    יום שני 09 יולי 2012 15:41
  • בוקר טוב

    אתה תמיד יכול בשאילתת ה SELECT שלך לבצע המרה מפורשת לסוגים שאתה רוצה בתוצאה ובכך לקבוע את הסוגים שיהיו בתוצאה ולא לתת לשרת לקבוע לך זאת (בצורה זו אפשר גם לשנות את הסוג המקורי)

    למשל

    select * into #New from (select id,convert(nvarchar(100),txt) as txt from #Old) T GO

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

    * אכן נראה שהבעיה היא כמו שאתה אומר המרה של varchar ל bigint. זה רשום במפורש אחרי הכל :-)

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

    תוכל לבדוק אם הקישור הזה עוזר לך:

    using union queries that return different field type


    signature


    • נערך על-ידי pituachMVP, Moderator יום שלישי 10 יולי 2012 06:25
    • סומן כתשובה על-ידי eran2b יום שלישי 10 יולי 2012 09:12
    יום שלישי 10 יולי 2012 06:24
    מנחה דיון
  • 1. איך אדע לאיזה עמודה לבצע?

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

    אתה יכול לדעת במקרה שלך שהבעיה קשורה לעמודה שמקור היתה varchar ולכן אם אתה עצלן יותר אתה יכול לבצע המרה מפורשת רק לעמודות מסוג זה

    2. כי בסופו של דבר השאילתה רצה כ-20 שניות ואז נופלת על ההודעה הזו בלי שאדע על מה....

    הפתרון שאני משתמש בו הוא שונה לחלוטין במקרה של העברה נתונים רבים בדיוק מהסיבות האלה בין השאר (יש עוד סיבות):

    בשלב ראשון: אתה יכול לייצר קודם את הטבלה (אפשר גם בצורה דינאמית על ידי select into ובחירה רק של שורה אחת בעזרת TOP כדי לקבל טבלה זהה למקור בלי להתעסק עם היצירה שלה)

    בשלב שני: אני מעביר את הנתונים בעזרת BCP ושימוש ב bulk insert למשל.

    BCP מאפשר error handler מלא. הוא מאפשר לך להמשיך את הפעולה של העברת הרשומות גם אם יש רשומה או יותר שנכשלה. יותר מכך BCP גם מאפשר לייצר לוג שגיאות טקסטואלי של כל השגיאות כך שבסיום אתה יכול לעבור על הלוג ולראות איזה רשומות לא הוכנסו נכון ולמה.

    אני מציע לקרוא יותר על עבודה עם BCP ועל bulk insert ולחשוב על שמוש בדרך זו. אתה יכול לחפש בגוגל מדריכים ודוגמאות (חפש את המילים sql bcp error handling)

    3. sp_executesql

    הפורום אינו בדיוק מקום לימוד אלא מקום שמתאים יותר לתמיכה נקודתית. גוגל הוא מקום למצוא בו מאות אלפי דוגמאות ומדריכים. אתה יכול לבצע את החיפוש כמוני :-)

    פשוט חפש את המילה sp_executesql ואם אתה רוצה תוכל גם להוסיף לחיפוש את המילה dynamic sql.

    במשפט אחד: sp_executesql היא פרוצדורה מובנית בשרת המאפשרת להריץ שאילתות דינאמיות. ז"א אתה מגדיר משתנה טקסטואלי ומכניס אליו שרשרת טקסט של שאילתה, מגדיר פרמטרים ומריץ את הטקסט דרך sp_executesql.

    *** הערה: אם היית מצרף את השאילתה שלך מההתחלה היה לאנשים יותר קל להבין היכן יכולות להיות הבעיות. עדיין לא מזיק לצרף את הנתונים :-) אם כי הפתרון שכתבתי כאן אמור לכסות לך את השאלה אני חושב


    signature

    • נערך על-ידי pituachMVP, Moderator יום שלישי 10 יולי 2012 07:01
    • סומן כתשובה על-ידי eran2b יום שלישי 10 יולי 2012 09:11
    יום שלישי 10 יולי 2012 06:56
    מנחה דיון

כל התגובות

  • שלום,

    1. בגדול הודעת השגיאה הנ"ל תתקבל כש SQL  לא יצליח להמיר Data type אחד לשני .

    2. לדעתי השגיאה מכילה בד"כ מידע  נוסף שעשוי לעלות על זהות הרשומה הבעייתית

    3. איפיון נכון של data types  ושימוש ב Cast  במידת הצורך  לטיוב הנתונים 

    http://msdn.microsoft.com/en-us/library/ms187928.aspx

    מקווה שעזרתי,

    נועם

    • סומן כתשובה על-ידי eran2b יום שלישי 10 יולי 2012 09:12
    יום שני 09 יולי 2012 15:41
  • היי,

    יש מידע נוסף- למשל ההודעה הזו:

    Error converting data type varchar to bigint

    קיימת שאילתה שהתוצאה היא יותר מ-10 עמודות מ-7טבלאות שונות.

    לפי השגיאה כאן אני מבין שיש עמודה varchar בטבלת מקור מסוימת אותה אני מנסה להכניס לעמודת bigint בטבלת היעד.

    אני צודק?

    במידה וכן אז ב- select into אני לא קובע את טיפוס הנתונים- אז למה זה נופל? 

     וכשאשר ניסיתי לבצע insert לטבלה- מראשי הגדרתי את העמודות כ- varchar --ועדיין אני מקבל את ההודעה.

    בנוגע ל- cast או convert? איך אני אדע באיזה עמודות לבצע?

    יום שלישי 10 יולי 2012 05:42
  • בוקר טוב

    אתה תמיד יכול בשאילתת ה SELECT שלך לבצע המרה מפורשת לסוגים שאתה רוצה בתוצאה ובכך לקבוע את הסוגים שיהיו בתוצאה ולא לתת לשרת לקבוע לך זאת (בצורה זו אפשר גם לשנות את הסוג המקורי)

    למשל

    select * into #New from (select id,convert(nvarchar(100),txt) as txt from #Old) T GO

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

    * אכן נראה שהבעיה היא כמו שאתה אומר המרה של varchar ל bigint. זה רשום במפורש אחרי הכל :-)

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

    תוכל לבדוק אם הקישור הזה עוזר לך:

    using union queries that return different field type


    signature


    • נערך על-ידי pituachMVP, Moderator יום שלישי 10 יולי 2012 06:25
    • סומן כתשובה על-ידי eran2b יום שלישי 10 יולי 2012 09:12
    יום שלישי 10 יולי 2012 06:24
    מנחה דיון
  • היי,

    לא משתמש ב- union אלא ב- select עם inner join ממספר טבלאות. בכל מקרה אבדוק את דוגמא לקוד שצירפית, אבל שוב אני שואל ( ויכול להיות שאין תשובה..) איך אדע לאיזה עמודה לבצע?

    לבצע לכולן?

    כי בסופו של דבר השאילתה רצה כ-20 שניות ואז נופלת על ההודעה הזו בלי שאדע על מה.

    בנוגע sp_executesql- אשמח אם תרחיב ותדגים...

    תודה מראש

    • סומן כתשובה על-ידי eran2b יום שלישי 10 יולי 2012 09:12
    • סימון כתשובה בוטל על-ידי eran2b יום שלישי 10 יולי 2012 09:12
    יום שלישי 10 יולי 2012 06:30
  • 1. איך אדע לאיזה עמודה לבצע?

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

    אתה יכול לדעת במקרה שלך שהבעיה קשורה לעמודה שמקור היתה varchar ולכן אם אתה עצלן יותר אתה יכול לבצע המרה מפורשת רק לעמודות מסוג זה

    2. כי בסופו של דבר השאילתה רצה כ-20 שניות ואז נופלת על ההודעה הזו בלי שאדע על מה....

    הפתרון שאני משתמש בו הוא שונה לחלוטין במקרה של העברה נתונים רבים בדיוק מהסיבות האלה בין השאר (יש עוד סיבות):

    בשלב ראשון: אתה יכול לייצר קודם את הטבלה (אפשר גם בצורה דינאמית על ידי select into ובחירה רק של שורה אחת בעזרת TOP כדי לקבל טבלה זהה למקור בלי להתעסק עם היצירה שלה)

    בשלב שני: אני מעביר את הנתונים בעזרת BCP ושימוש ב bulk insert למשל.

    BCP מאפשר error handler מלא. הוא מאפשר לך להמשיך את הפעולה של העברת הרשומות גם אם יש רשומה או יותר שנכשלה. יותר מכך BCP גם מאפשר לייצר לוג שגיאות טקסטואלי של כל השגיאות כך שבסיום אתה יכול לעבור על הלוג ולראות איזה רשומות לא הוכנסו נכון ולמה.

    אני מציע לקרוא יותר על עבודה עם BCP ועל bulk insert ולחשוב על שמוש בדרך זו. אתה יכול לחפש בגוגל מדריכים ודוגמאות (חפש את המילים sql bcp error handling)

    3. sp_executesql

    הפורום אינו בדיוק מקום לימוד אלא מקום שמתאים יותר לתמיכה נקודתית. גוגל הוא מקום למצוא בו מאות אלפי דוגמאות ומדריכים. אתה יכול לבצע את החיפוש כמוני :-)

    פשוט חפש את המילה sp_executesql ואם אתה רוצה תוכל גם להוסיף לחיפוש את המילה dynamic sql.

    במשפט אחד: sp_executesql היא פרוצדורה מובנית בשרת המאפשרת להריץ שאילתות דינאמיות. ז"א אתה מגדיר משתנה טקסטואלי ומכניס אליו שרשרת טקסט של שאילתה, מגדיר פרמטרים ומריץ את הטקסט דרך sp_executesql.

    *** הערה: אם היית מצרף את השאילתה שלך מההתחלה היה לאנשים יותר קל להבין היכן יכולות להיות הבעיות. עדיין לא מזיק לצרף את הנתונים :-) אם כי הפתרון שכתבתי כאן אמור לכסות לך את השאלה אני חושב


    signature

    • נערך על-ידי pituachMVP, Moderator יום שלישי 10 יולי 2012 07:01
    • סומן כתשובה על-ידי eran2b יום שלישי 10 יולי 2012 09:11
    יום שלישי 10 יולי 2012 06:56
    מנחה דיון