none
הוספת כמה ערכים לטבלת קישור RRS feed

  • שאלה

  • שלום 

    אני עובד ב SQL SERVER 2008

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

    אני מקבל כפרמטרים

    1.CustomerId

    2.מערך של OrderIds (בצורה של StringSplited)

    השאלה היא איך אני עובר אחד אחד ועושה INSERT INTO וכו',

    בשביל להכניס ל CustomerToOrder??


     

    תודה


    • נערך על-ידי 8Menny יום שלישי 08 מאי 2012 16:11
    יום שלישי 08 מאי 2012 13:30

תשובות

  • מצ"ב קוד

    DECLARE @NextString NVARCHAR(40)
    DECLARE @Pos INT
    DECLARE @NextPos INT
    DECLARE @String NVARCHAR(40)
    DECLARE @Delimiter NVARCHAR(40)

    SET @String ='SQL,TUTORIALS'
    SET @Delimiter = ','
    SET @String = @String + @Delimiter
    SET @Pos = charindex(@Delimiter,@String)

    WHILE (@pos <> 0)
    BEGIN
    SET @NextString = substring(@String,1,@Pos - 1)
    SELECT @NextString -- Show Results
    SET @String = substring(@String,@pos+1,len(@String))
    SET @pos = charindex(@Delimiter,@String)
    END 

    במקום SELECT @NextString -- Show Results תרשום מה שבא לך והערך הנוכחי בלולאה הוא @NextString

    הקוד נלקח מאתר

    http://sqltutorials.blogspot.com/2007/09/sql-function-split.html

    • סומן כתשובה על-ידי 8Menny יום רביעי 09 מאי 2012 10:42
    יום רביעי 09 מאי 2012 10:17

כל התגובות

  • אני מקווה שאני מבין אותך :-)
    אתה רוצה לקחת נתון למשל עם 2 טורים
    CustomerId + שרשרת שכוללת מספרים של הזמנות בהפרדת פסיק.
    את הנתון הזה אתה רוצה לפרק ולהכניס לטבלת ההזמנות?

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

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

    ז"א משהו בסגנון

    INSERT INTO table_name ([column1], ...)
    SELECT * FROM Split_function(your_string) as S

    אם זה מתאים לך אני אוכל לצרף לך קישור לקוד והסבר על פונקציה מתאימה ב CLR

    האם זה מה שאתה מחפש?


    signature

    • הוצע כתשובה על-ידי EitanBlumin יום רביעי 09 מאי 2012 05:57
    יום שלישי 08 מאי 2012 20:53
    מנחה דיון
  • אני בדר"כ משתמש בשאילטות ישירות ללא SP ואז אני ישר שם את הערכים באמצעות IN וללא יצירה של טבלה זמנית.

    לצורך הדוגמא יש להפוך את ה SPLIT לטבלה זמנית ואז לעשות SELECT עם innerjoin

    שים לב שאין את מילה החיבור VALUES מכיוון שאני משתמש בשאילטת SELECT

    אני בד"כ עושה במקרים כאלה:

    delete orderdetails where order_id = @orderid;

    insert into orderdetails (order_id,product)(select @orderid,product_id from product inner join #temp on product.product_id = #temp.id)

    יום רביעי 09 מאי 2012 07:17
  • ראשית,תודה על המענה

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

    ב.הבנת את כוונתי

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

    הבעיה שלי היא תחבירית יותר,איך להכניס את הערכים בלולאה,

    כלומר איך להוציא מה-splitFunction ערך ערך ולעשות לו INSERT לתוך הטבלת קישור??(בדגש על איך לעבור ערך ערך)

    אני מקווה שאני מובן.

    ושוב תודה

    יום רביעי 09 מאי 2012 07:20
  • מצ"ב קוד

    DECLARE @NextString NVARCHAR(40)
    DECLARE @Pos INT
    DECLARE @NextPos INT
    DECLARE @String NVARCHAR(40)
    DECLARE @Delimiter NVARCHAR(40)

    SET @String ='SQL,TUTORIALS'
    SET @Delimiter = ','
    SET @String = @String + @Delimiter
    SET @Pos = charindex(@Delimiter,@String)

    WHILE (@pos <> 0)
    BEGIN
    SET @NextString = substring(@String,1,@Pos - 1)
    SELECT @NextString -- Show Results
    SET @String = substring(@String,@pos+1,len(@String))
    SET @pos = charindex(@Delimiter,@String)
    END 

    במקום SELECT @NextString -- Show Results תרשום מה שבא לך והערך הנוכחי בלולאה הוא @NextString

    הקוד נלקח מאתר

    http://sqltutorials.blogspot.com/2007/09/sql-function-split.html

    • סומן כתשובה על-ידי 8Menny יום רביעי 09 מאי 2012 10:42
    יום רביעי 09 מאי 2012 10:17
  • ממש תודה
    יום רביעי 09 מאי 2012 10:42
  • זו פעולה מאוד מאוד לא יעילה של לולאות על שרשרת טקסט

    אני מאוד ממליץ לא לעבוד בצורה זו.

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

    שים לב לגרף ההשואה בין עבודה עם CLR לבין עבודה עם TSQL עבור SPLIT:

    http://sqlserverperformance.idera.com/tsql-optimization/comparing-simple-efficiencies-tsql-udf-sqclr-udf-splitting-strings/

    והנה השוואה נוספת של מספר גישות שונות ב TSQL וכמובן CLR

    http://sqlblog.com/blogs/aaron_bertrand/archive/2010/07/07/splitting-a-list-of-integers-another-roundup.aspx

    ההבדל יכול להיות בין שניות לבין שעה והרבה יותר גם!


    signature

    יום רביעי 09 מאי 2012 12:30
    מנחה דיון
  • היי אריאלי. אני מאד מעריך את דעתך אך במקרה הזה אני חולק על דעתך.

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

    אבל אני לא חושב שזה המקרה של מני.

    בד"כ האנשים הפשוטים מתמודדים עם גג 50 פריטים כל בקשה (שאילטה) כך שאין הבדל בביצועים בין ה CLR לבין ה TSQL.

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

    ועובדה שהוא לא הבין איך להשתמש ב CLR ואז לעשות לולאה על התוצאה.

    יום חמישי 10 מאי 2012 13:53
  • כנראה שנשאר חלוקים כאן :-)

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

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

    ונקודה נוספת אחרונה היא שפונקציה SPLIT כמו גם פונקציות אחרות מוסיפים פעם אחת בלבד לכל השרת, ולא לכל מסד נתונים ולכן זו פעולה בודדת לכל חיי השרת! יש לי אוסף של פוקציות (בעיקר CLR אבל לא רק) ועזרים שאני מוסיף פעם אחת לאחר ההתקנה או כשאני צריך אותם בפעם הראשונה והן משמשות בעתיד לצרכים רבים .לדוגמה טבלת מספרים שאני תמיד מוסיף וכאמור פוקנציות CR שונות שחלקן הוספו דרך אגב ב גרסה 2012 ואני כבר הכנסתי תמיד מגרסה 2005 כמו FORMAT :-).


    signature

    יום שישי 11 מאי 2012 10:41
    מנחה דיון