logo

סמן ב-SQL Server

סמן ב-SQL Server הוא ד אובייקט atabase המאפשר לנו לאחזר כל שורה בכל פעם ולתפעל את הנתונים שלה . סמן אינו אלא מצביע לשורה. הוא משמש תמיד בשילוב עם הצהרת SELECT. זה בדרך כלל אוסף של SQL לוגיקה שעוברת בלולאה דרך מספר קבוע מראש של שורות אחת אחת. המחשה פשוטה של ​​הסמן היא כאשר יש לנו מאגר מידע נרחב של רישומי עובדים ורוצים לחשב את השכר של כל עובד לאחר ניכוי מיסים ועלים.

שרת ה-SQL מטרת הסמן היא לעדכן את הנתונים שורה אחר שורה, לשנות אותם או לבצע חישובים שאינם אפשריים כאשר אנו מאחזרים את כל הרשומות בבת אחת . זה גם שימושי לביצוע משימות ניהול כמו גיבויים של מסדי נתונים של SQL Server בסדר עוקב. סמנים משמשים בעיקר בתהליכי פיתוח, DBA ו-ETL.

מאמר זה מסביר הכל על סמן SQL Server, כגון מחזור החיים של הסמן, מדוע ומתי נעשה שימוש בסמן, כיצד ליישם סמנים, מגבלותיו וכיצד אנו יכולים להחליף סמן.

מחזור החיים של הסמן

אנו יכולים לתאר את מחזור החיים של סמן לתוך חמישה חלקים שונים כדלהלן:

סמן ב-SQL Server

1: הכריז על סמן

הצעד הראשון הוא להכריז על הסמן באמצעות הצהרת SQL שלהלן:

כיצד לקבוע את גודל הצג
 DECLARE cursor_name CURSOR FOR select_statement; 

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

2: פתח את הסמן

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

 OPEN cursor_name; 

3: אחזר סמן

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

 FETCH NEXT FROM cursor INTO variable_list; 

אנחנו יכולים גם להשתמש ב @@פונקציית FETCHSTATUS ב-SQL Server כדי לקבל את הסטטוס של סמן משפט FETCH האחרון שהופעל כנגד הסמן. ה לְהָבִיא המשפט הצליח כאשר @@FETCHSTATUS נותן פלט אפס. ה בזמן ניתן להשתמש בהצהרה כדי לאחזר את כל הרשומות מהסמן. הקוד הבא מסביר זאת בצורה ברורה יותר:

 WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM cursor_name; END; 

4: סגור את הסמן

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

 CLOSE cursor_name; 

5: הקצה את הסמן

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

 DEALLOCATE cursor_name; 

שימושים בסמן SQL Server

אנו יודעים שמערכות ניהול מסדי נתונים יחסיים, כולל SQL Server, מצוינות בטיפול בנתונים על קבוצה של שורות הנקראות ערכות תוצאות. לדוגמה , יש לנו שולחן טבלת_מוצר שמכיל את תיאורי המוצר. אם אנחנו רוצים לעדכן את מחיר של המוצר, ולאחר מכן את ' עדכון' השאילתה תעדכן את כל הרשומות התואמות את התנאי ב' איפה' סָעִיף:

 UPDATE product_table SET unit_price = 100 WHERE product_id = 105; 

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

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

סוגי סמנים ב-SQL Server

להלן סוגי הסמנים השונים ב-SQL Server המפורטים להלן:

  • סמנים סטטיים
  • סמנים דינמיים
  • סמנים קדימה בלבד
  • סמני מפתחות
סמן ב-SQL Server

סמנים סטטיים

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

סמן זה מציג שורות שהוסרו ממסד הנתונים לאחר פתיחתו. סמן סטטי אינו מייצג פעולות INSERT, UPDATE או DELETE (אלא אם כן הסמן נסגר ונפתח מחדש).

סמנים דינמיים

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

סמנים קדימה בלבד

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

הסמנים קדימה בלבד הם שלושה מסווגים לשלושה סוגים:

  1. Forward_Only Keyset
  2. קדימה_רק סטטי
  3. Fast_Forward
סמן ב-SQL Server

סמנים מונעים על ערכת מפתחות

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

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

יישום דוגמה

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

איפה אני מוצא את הגדרות הדפדפן שלי
 CREATE TABLE customer ( id int PRIMARY KEY, c_name nvarchar(45) NOT NULL, email nvarchar(45) NOT NULL, city nvarchar(25) NOT NULL ); 

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

 INSERT INTO customer (id, c_name, email, city) VALUES (1,'Steffen', '[email protected]', 'Texas'), (2, 'Joseph', '[email protected]', 'Alaska'), (3, 'Peter', '[email protected]', 'California'), (4,'Donald', '[email protected]', 'New York'), (5, 'Kevin', '[email protected]', 'Florida'), (6, 'Marielia', '[email protected]', 'Arizona'), (7,'Antonio', '[email protected]', 'New York'), (8, 'Diego', '[email protected]', 'California'); 

אנו יכולים לאמת את הנתונים על ידי ביצוע ה בחר הַצהָרָה:

 SELECT * FROM customer; 

לאחר ביצוע השאילתה, נוכל לראות את הפלט למטה היכן שיש לנו שמונה שורות לתוך הטבלה:

סמן ב-SQL Server

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

אלגוריתם מקבצים של k
 --Declare the variables for holding data. DECLARE @id INT, @c_name NVARCHAR(50), @city NVARCHAR(50) --Declare and set counter. DECLARE @Counter INT SET @Counter = 1 --Declare a cursor DECLARE PrintCustomers CURSOR FOR SELECT id, c_name, city FROM customer --Open cursor OPEN PrintCustomers --Fetch the record into the variables. FETCH NEXT FROM PrintCustomers INTO @id, @c_name, @city --LOOP UNTIL RECORDS ARE AVAILABLE. WHILE @@FETCH_STATUS = 0 BEGIN IF @Counter = 1 BEGIN PRINT 'id' + CHAR(9) + 'c_name' + CHAR(9) + CHAR(9) + 'city' PRINT '--------------------------' END --Print the current record PRINT CAST(@id AS NVARCHAR(10)) + CHAR(9) + @c_name + CHAR(9) + CHAR(9) + @city --Increment the counter variable SET @Counter = @Counter + 1 --Fetch the next record into the variables. FETCH NEXT FROM PrintCustomers INTO @id, @c_name, @city END --Close the cursor CLOSE PrintCustomers --Deallocate the cursor DEALLOCATE PrintCustomers 

לאחר ביצוע סמן, נקבל את הפלט הבא:

סמן ב-SQL Server

מגבלות של סמן SQL Server

לסמן יש מגבלות מסוימות כך שהוא צריך להשתמש תמיד רק כאשר אין אפשרות מלבד הסמן. מגבלות אלו הן:

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

כיצד נוכל להימנע מסמנים?

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

שימוש בלולאת SQL while

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

פונקציות מוגדרות על ידי משתמש

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

שימוש ב-Joins

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