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

שאלה
-
שלום
אני עובד ב SQL SERVER 2008
אני מעונין להוסיף כמה ערכים ביחד לטבלת קישור
אני מקבל כפרמטרים
1.CustomerId
2.מערך של OrderIds (בצורה של StringSplited)השאלה היא איך אני עובר אחד אחד ועושה INSERT INTO וכו',
בשביל להכניס ל CustomerToOrder??
תודה
- נערך על-ידי 8Menny יום שלישי 08 מאי 2012 16:11
תשובות
-
מצ"ב קוד
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
כל התגובות
-
אני מקווה שאני מבין אותך :-)
אתה רוצה לקחת נתון למשל עם 2 טורים
CustomerId + שרשרת שכוללת מספרים של הזמנות בהפרדת פסיק.
את הנתון הזה אתה רוצה לפרק ולהכניס לטבלת ההזמנות?א. [בלי קשר] אני לא מבין את המבנה הטבלאי שלך ולמה יש לך טבלה מקשרת כשהיחס בין הזמנה לבין לקוח הוא יחס של יחיד לרבים. לא יכולה להיות הזמנה שמגיעה מכמה לקוחות. מצד שני כן יכול להיות כמה הזמנות לאותו לקוח. ביחס יחיד לרבים למה צריך טבלה נוספת?
ב. אם הבנתי טוב את מה שאתה רוצה לפי ההסבר שלי למעלה אז אתה יכול להעזר בפונקצית SPLIT פשוטה של CLR (אפשר גם ב TSQL אבל מאוד לא מומלץ.. ההבדל גדול), כדי להפריד את השרשרת של הזמנות לטבלה זמנית (הפונקציה מקבלת שרשרת ומחזירה משתנה של טבלה) ואת הנתון הזה מכניסים פשוט לטבלה של ההזמנות.
ז"א משהו בסגנון
INSERT INTO table_name ([column1], ...) SELECT * FROM Split_function(your_string) as S
אם זה מתאים לך אני אוכל לצרף לך קישור לקוד והסבר על פונקציה מתאימה ב CLR
האם זה מה שאתה מחפש?
- הוצע כתשובה על-ידי EitanBlumin יום רביעי 09 מאי 2012 05:57
-
אני בדר"כ משתמש בשאילטות ישירות ללא 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)
-
ראשית,תודה על המענה
א.למען האמת את הדיאגרמה העתקתי ממקום אחר והטבלה שאליה אני רוצה להכניס את הנתונים היא רבים לרבים.
ב.הבנת את כוונתי
אני יודע איך להשתמש בפונקציה SPLIT בתוך הSQL ולהכניס את הערכים לטבלה,
הבעיה שלי היא תחבירית יותר,איך להכניס את הערכים בלולאה,
כלומר איך להוציא מה-splitFunction ערך ערך ולעשות לו INSERT לתוך הטבלת קישור??(בדגש על איך לעבור ערך ערך)
אני מקווה שאני מובן.
ושוב תודה
-
מצ"ב קוד
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
-
-
זו פעולה מאוד מאוד לא יעילה של לולאות על שרשרת טקסט
אני מאוד ממליץ לא לעבוד בצורה זו.
בשביל SPLIT אין צורך בשום לולאה אלא במילה אחת של CLR. זה הקוד הכי קטן שאפשר לחשוב עליו ב CLR כי זו פונקציה מובנית ומאוד יעילה בדוט נט בשם SPLIT
שים לב לגרף ההשואה בין עבודה עם CLR לבין עבודה עם TSQL עבור SPLIT:
והנה השוואה נוספת של מספר גישות שונות ב TSQL וכמובן CLR
ההבדל יכול להיות בין שניות לבין שעה והרבה יותר גם!
- נערך על-ידי pituachMVP, Moderator יום חמישי 10 מאי 2012 00:59
-
היי אריאלי. אני מאד מעריך את דעתך אך במקרה הזה אני חולק על דעתך.
נכון שבמקרה ויש לך יותר מ 1000 פריטים שאתה צריך לעשות להם SPLIT זה מומלץ לעבוד עם ה CLR ובצדק.
אבל אני לא חושב שזה המקרה של מני.
בד"כ האנשים הפשוטים מתמודדים עם גג 50 פריטים כל בקשה (שאילטה) כך שאין הבדל בביצועים בין ה CLR לבין ה TSQL.
בקיצור אני לא חושב שכדאי להתחיל לסבך את הקוד עם CLR (למרות שזה פשוט וקיים כבר 7 שנים).
ועובדה שהוא לא הבין איך להשתמש ב CLR ואז לעשות לולאה על התוצאה.
-
כנראה שנשאר חלוקים כאן :-)
העובדה שמישהו לא מבין היא לא תירוץ בעיני לא לשאול וכן להבין! מה גם שלוקח 10 דקות לבצע את זה מול מדריכים של צעד אחרי צעד שיש באינטרנט, ואם זה הבעיה הייתי מביא לו מדריך כזה ואם לא היה הייתי כותב אחד.
כמו כן הטענה שזה בסדר לכתוב שאילתה שלוקחת פי מליון (לצורך העניין סתם אני זורק מספר סביר) יותר משאבים רק כי אנחנו לא צריכים את המשאבים ויש לנו מספיק, לא ניראית בעיני נכונה. אם הטענה היתה זמן פיתוח הייתי מבין. הרבה פעמים החלטות מתקבלות על בסיס של ייתרונות מול חסרונות ולפעמים לרשום את השאילתה הראשונה שיש בראש אכן טוב יותר מללכת לחשוב יומיים (אבל זה לא המצב כאן כי הוא לא צריך לחשוב... בשביל זה אנחנו כאן ואני יכול להדריך אותו)
ונקודה נוספת אחרונה היא שפונקציה SPLIT כמו גם פונקציות אחרות מוסיפים פעם אחת בלבד לכל השרת, ולא לכל מסד נתונים ולכן זו פעולה בודדת לכל חיי השרת! יש לי אוסף של פוקציות (בעיקר CLR אבל לא רק) ועזרים שאני מוסיף פעם אחת לאחר ההתקנה או כשאני צריך אותם בפעם הראשונה והן משמשות בעתיד לצרכים רבים .לדוגמה טבלת מספרים שאני תמיד מוסיף וכאמור פוקנציות CR שונות שחלקן הוספו דרך אגב ב גרסה 2012 ואני כבר הכנסתי תמיד מגרסה 2005 כמו FORMAT :-).