הוספת נתונים
Transact-SQL מספק דרכים מרובות להוספת שורות לטבלה.
משפט INSERT
משפט INSERT משמש להוספת שורה אחת או יותר לטבלה. קיימות כמה צורות של המשפט.
התחביר הבסיסי של משפט INSERT פשוט מוצג להלן:
INSERT [INTO] <Table> [(column_list)]
VALUES ([ColumnName or an expression or DEFAULT or NULL],…n)
באמצעות צורה זו של משפט INSERT, הנקרא INSERT VALUES, באפשרותך לציין את העמודות שיוצגו בהן ערכים ואת הסדר שבו הנתונים יוצגו עבור כל שורה שנוספת לטבלה. רשימת column_list היא אופציונלית אך מומלצת. ללא column_list, המשפט INSERT יצפה לערך עבור כל עמודה בטבלה בסדר שבו העמודות הוגדרו. באפשרותך גם לספק את הערכים עבור עמודות אלה כרשימה מופרדת באמצעות פסיקים.
בעת רישום ערכים, מילת המפתח DEFAULT פירושה ערך מוגדר מראש, שצוין בעת יצירת הטבלה, ישמש. קיימות שלוש דרכים לקבוע ברירת מחדל:
- אם עמודה הוגדרה כערך שנוצר באופן אוטומטי, ייעשה שימוש בערך זה. ערכים שנוצרים באופן אוטומטי נדונו בהמשך מודול זה.
- בעת יצירת טבלה, ניתן להוסיף ערך ברירת מחדל עבור עמודה, וערך זה ישמש אם צוין ברירת מחדל.
- אם הוגדרה עמודה המאפשרת ערכי NULL, והעמודה אינה עמודה שנוצרה באופן אוטומטי ולא מוגדרת בה ברירת מחדל, NULL יתווסף כברירת מחדל.
הפרטים של יצירת טבלה אינם נכללים במודול זה. עם זאת, לעתים קרובות כדאי לראות אילו עמודות נמצאות בטבלה. הדרך הקלה ביותר היא פשוט לבצע משפט SELECT בטבלה מבלי להחזיר שורות. על-ידי שימוש בתנאי WHERE שמעולם לא יכול להיות TRUE, לא ניתן להחזיר שורות.
SELECT * FROM Sales.Promotion
WHERE 1 = 0;
הצהרה זו תציג לך את כל העמודות ואת שמות העמודות, אך לא תציג את סוגי הנתונים או מאפיינים כלשהם, כגון אם כתובות NUL מותרות, או אם צוין ערכי ברירת מחדל. דוגמה של הפלט מהשאילתה עשויה להיראות כך:
שם קידום מכירות
תאריך התחלה
ProductModelID
הנחה
הערות
כדי להוסיף נתונים לטבלה זו, באפשרותך להשתמש במשפט INSERT כפי שמוצג כאן.
INSERT INTO Sales.Promotion (PromotionName,StartDate,ProductModelID,Discount,Notes)
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');
בדוגמה זו שלעיל, ניתן להשמיט את רשימת העמודות, מכיוון שאנו מספקים ערך עבור כל עמודה בסדר הנכון:
INSERT INTO Sales.Promotion
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');
נניח שהטבלה מוגדרת כך שערך ברירת מחדל של התאריך הנוכחי יוחל על העמודה StartDate, והעמודה Notes תאפשר ערכי NULL. באפשרותך לציין שברצונך להשתמש בערכים אלה באופן מפורש, באופן הבא:
INSERT INTO Sales.Promotion
VALUES
('Pull your socks up', DEFAULT, 24, 0.25, NULL);
לחלופין, באפשרותך להשמיט ערכים במשפט INSERT, במקרה זה ערך ברירת המחדל ישמש אם הוא מוגדר, ואם אין ערך ברירת מחדל אך העמודה מאפשרת NULLs, יתווסף NULL. אם אינך מספק ערכים עבור כל העמודות, דרושה לך רשימת עמודות המצייינים אילו ערכי עמודות אתה מספק.
INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount)
VALUES
('Caps Locked', 2, 0.2);
בנוסף להוספת שורה בודדת בכל פעם, ניתן להשתמש במשפט INSERT VALUES כדי להוסיף שורות מרובות על-ידי מתן מספר קבוצות ערכים המופרדות באמצעות פסיקים. קבוצות הערכים מופרדות גם באמצעות פסיקים, באופן הבא:
(col1_val,col2_val,col3_val),
(col1_val,col2_val,col3_val)
רשימת ערכים זו נקראת בנאי ערך טבלה. להלן דוגמה להוספת שתי שורות נוספות לטבלה שלנו באמצעות בנאי ערך טבלה:
INSERT INTO Sales.Promotion
VALUES
('The gloves are off!', DEFAULT, 3, 0.25, NULL),
('The gloves are off!', DEFAULT, 4, 0.25, NULL);
להוסיף... בחר
בנוסף לציון ערכה ליטרלית של ערכים במשפט INSERT, T-SQL תומך גם הוא בשימוש בתוצאות של פעולות אחרות כדי לספק ערכים עבור INSERT. באפשרותך להשתמש בתוצאות של משפט SELECT או בפלט של פרוצדורה מאוחסנת כדי לספק את הערכים עבור משפט INSERT.
כדי להשתמש ב- INSERT עם SELECT מקונן, בנה משפט SELECT כדי להחליף את המשפט VALUES. באמצעות טופס זה, שנקרא INSERT SELECT, באפשרותך להוסיף את קבוצת השורות שהוחזרו על-ידי שאילתת SELECT לטבלת יעד. השימוש ב- INSERT SELECT מציג את אותם שיקולים כמו INSERT VALUES:
- באפשרותך לציין רשימת עמודות לאחר שם הטבלה.
- עליך לספק ערכי עמודות או ברירת מחדל, או NULL, עבור כל עמודה.
התחביר הבא ממחיש את השימוש ב- INSERT SELECT:
INSERT [INTO] <table or view> [(column_list)]
SELECT <column_list> FROM <table_list>...;
הערה
ערכות תוצאות מתוך פרוצדורות מאוחסנות (או אפילו אצוות דינאמיות) עשויות לשמש גם כקלט במשפט INSERT. צורת INSERT זו, הנקראת INSERT EXEC, דומה לקונספטואלית ל- INSERT SELECT והיא תציג את אותם שיקולים. עם זאת, פרוצדורות מאוחסנות יכולות להחזיר ערכות תוצאות מרובות, ולכן נדרש טיפול נוסף.
הדוגמה הבאה מוסיפה שורות מרובות עבור קידום מכירות חדש בשם קבל מסגרת על-ידי אחזור מזהה המודל ואת שם המודל מ- Production.ProductModel, טבלה עבור כל מודל המכיל "מסגרת" בשם שלו.
INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount, Notes)
SELECT DISTINCT 'Get Framed', m.ProductModelID, 0.1, '10% off ' + m.Name
FROM Production.ProductModel AS m
WHERE m.Name LIKE '%frame%';
בניגוד לשאלת משנה, הפונקציה SELECT המקוננת המשמשת עם INSERT אינה מוקפת בסוגריים.
בחר... לתוך
אפשרות נוספת להוספת שורות, הדומה ל- INSERT SELECT, היא משפט SELECT INTO. ההבדל הגדול ביותר בין INSERT SELECT ל- SELECT INTO הוא שלא ניתן להשתמש ב- SELECT INTO כדי להוסיף שורות לטבלה קיימת, מכיוון שהיא תמיד יוצרת טבלה חדשה המבוססת על התוצאה של SELECT. לכל עמודה בטבלה החדשה יהיה אותו שם, סוג נתונים ו- Nullability כמו העמודה (או הביטוי) התואמת ברשימה SELECT.
כדי להשתמש ב- SELECT INTO, <new_table_name> INTO בפסוקית SELECT של השאילתה, ממש לפני משפט FROM. להלן דוגמה המחלץ נתונים מהטבלה Sales.SalesOrderHeader לטבלה חדשה בשם Sales.Invoice..
SELECT SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue
INTO Sales.Invoice
FROM Sales.SalesOrderHeader;
SELECT INTO ייכשל אם כבר קיימת טבלה בשם שצוין לאחר INTO. לאחר יצירת הטבלה, ניתן לטפל בה כמו כל טבלה אחרת. באפשרותך לבחור מטבלה זו, לצרף אותה לטבלאות אחרות או להוסיף אליה שורות נוספות.