none
מחיקת תו 0 ממחרוזת RRS feed

  • שאלה

  • ממקור חיצוני אני מקבל טבלה שיש בה מחרוזות שאני מנסה לטעון אותן ל XML.

    במחרוזות אלו יש לעתים (0) CHAR שאינו חוקי מבחינת XML.

    נסיתי להחליף אותו ברווחים בעזרת REPLACE אך בשום פנים זה לא עבד.

    כל עזרה תתקבל בברכה.


    אריה שטרן
    יום חמישי 25 אוגוסט 2011 13:23

תשובות

  • תודה לכל העונים !

    כתבתי פונקציית SQL בדוגמא לזו שהוצעה לעיל.

    לא הזדקקתי ל CLR כי כמות השורות שהייתי צריך לתקן אותן, קטנה יחסית.

    אריה


    אריה שטרן
    • סומן כתשובה על-ידי Meir Pinto יום שני 29 אוגוסט 2011 08:42
    יום ראשון 28 אוגוסט 2011 08:59
  • בוקר טוב אריה

    אנא סגור את השירשור על ידי סימון תשובה או מספר תשובות

    הדבר יגרור הפיכת סימן השאלה ליד השירשור לסימן V

    בברכה,

    • סומן כתשובה על-ידי אריה שטרן יום ראשון 28 אוגוסט 2011 09:46
    יום ראשון 28 אוגוסט 2011 09:33
    מנחה דיון

כל התגובות

  • שאלה נהדרת :-)

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

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

     

    declare @Str as nvarchar(100) =  (CHAR(48) + CHAR(49) + CHAR(50) + CHAR(51) + CHAR(0) + CHAR(55) + CHAR(56) + CHAR(57) + CHAR(58))

    select @Str,LEN(@Str)

    שים לב שלמרות שהשרשרת תחזיר רק 0123 האורך של השרשרת הוא 9 אבל פונקציות של SQL לא יודעות את זה והן מזהות שהשרשרת סתיימה.

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


    יום חמישי 25 אוגוסט 2011 16:55
    מנחה דיון
  • הסבר מלא לבעיה ופתרונות שונות ניתן לראות כאן:

    http://ariely.info/dnn/Blog/tabid/83/EntryId/60/Null-character.aspx

    נקודה חשובה...
    מעניין כיצד הגעת למצב שיש לך צורך לנקות תו זה

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


    ** והכי חשוב להבין שהפתרון שהאחרון שהצגתי (שימוש ב CLR) יכול להיות מיטבי בכמה סדרי גודל מהפתרון של ביצוע ה replace בתוך הטקסט עצמו

    יום שישי 26 אוגוסט 2011 12:45
    מנחה דיון
  • עברתי כרגע על המדריך שכתבתי לבדוק שגיאות הקלדה וכו' ברפרוף מהיר.. ופתאום עליתי על תוצאה מצחיקה :-)

    כשאני עובד ב C ב VS אני כותב הערות באנגלית (משהו טבוע בי אולי מהתקופה של עבודה בקומפיילרים ומערכות OS בלי עברית) אבל כשאני כותב ב C# או ב SQL אני כותב גם בעברית או בעיקר בעברית

    יום שישי 26 אוגוסט 2011 13:02
    מנחה דיון
  • הי,

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

    http://stackoverflow.com/questions/1007697/how-to-strip-all-non-alphabetic-characters-from-string-in-sql-server

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

    בהצלחה


    אסף שלם
    יום שישי 26 אוגוסט 2011 13:18
  • אסף

    אם תקרא את המדריך שלי תבין למה הפתרון שהבאת לא יעבוד :-)

    נסה להריץ :

    Select dbo.RemoveNonAlphaCharacters('abc1234def567' +CHAR(0) + '8ghi90jkl')

    והתוצאה תהיה :

    abcdef

    וההסבר במדריך שלי :-)

    אתה יכול גם להריץ את השאילתה באה כדי לזהות את הבעיה יותר טוב:

    Select
        dbo.RemoveNonAlphaCharacters('abc1234def567' +CHAR(0) + '8ghi90jkl') a
        ,dbo.RemoveNonAlphaCharacters('abc1234def5678ghi90jkl') s

    לא סתם כתבתי שזו "שאלה נהדרת :-)"
    יום שישי 26 אוגוסט 2011 14:00
    מנחה דיון
  • בלי קשר לבעיה המסויימת כאן הרי שהפונקציה שיש בקישור מאוד לא מומלצת לדעתי מבחינת משאבים. אני מומלץ לעשות שימוש בעבודה במקרה זה עם פונקציה פשוטה של CLR (שכמו שכתבתי במדריך גם תיתן פתרון לבעיה הספציפית של ניקוי תו אפס...)

    הפונקציה בקישור כאן מבצעת לולאה על התוונים במחרוזת. נסו להריץ אותה על מליון רשומות של nvarchar(MAX) ותוכלו לחזור למחרת לראות את התוצאות אולי :-)

    אותה פונקציהה ב CLR להערכתי תיתן תוצאה בכמה דקות

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

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

    *** תוספת למדריך

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

    • נערך על-ידי pituachMVP, Editor שבת 27 אוגוסט 2011 05:48 תיקון היחס: רשמתי בטעות קודם 1:100 וזה כמובן הרבה יותר 1:1000
    יום שישי 26 אוגוסט 2011 14:19
    מנחה דיון
  • היי,

    אשמח אם תוכל/י לעדכן אותנו בסטטוס השאלה שלך.

     

    במידה וקיבלת תשובה מתאימה לשאלתך, יש לסמן את התשובה המתאימה ע"י לחיצה על "סמן כתשובה" ליד סימון ה V הירוק

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

    על מנת להעלות תמונה לפורום ניתן להעזר במדריך להעלאת תמונה.


    אם תגובתי פתרה את בעייתך - לחץ/י, על "סמן כתשובה" ליד סימן ה V הירוק.

    על מנת להעלות תמונה לפורום ניתן להעזר במדריך להעלאת תמונה
    מיקרוסופט מציעה שירות זה ללא תשלום, למטרת סיוע למשתמשים והעשרת הידע הקשור בטכנולוגיות ובמוצרים של Microsoft. תוכן זה מתפרסם כפי שהוא והוא אינו מעיד על כל אחריות מצד מיקרוסופט.
    יום ראשון 28 אוגוסט 2011 07:22
  • תודה לכל העונים !

    כתבתי פונקציית SQL בדוגמא לזו שהוצעה לעיל.

    לא הזדקקתי ל CLR כי כמות השורות שהייתי צריך לתקן אותן, קטנה יחסית.

    אריה


    אריה שטרן
    • סומן כתשובה על-ידי Meir Pinto יום שני 29 אוגוסט 2011 08:42
    יום ראשון 28 אוגוסט 2011 08:59
  • בוקר טוב אריה

    אנא סגור את השירשור על ידי סימון תשובה או מספר תשובות

    הדבר יגרור הפיכת סימן השאלה ליד השירשור לסימן V

    בברכה,

    • סומן כתשובה על-ידי אריה שטרן יום ראשון 28 אוגוסט 2011 09:46
    יום ראשון 28 אוגוסט 2011 09:33
    מנחה דיון