إدراج بيانات

مكتمل

يوفر 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 أن القيمة المعرفة مسبقًا، التي تم تحديدها عند إنشاء الجدول، سيتم استخدامها. هناك ثلاث طرق يمكن من خلالها تحديد الافتراضي:

  • إذا تم تعريف عمود يحتوي على قيمة تم إنشاؤها تلقائيًا، سيتم استخدام هذه القيمة. ستتم مناقشة القيم التي تم إنشاؤها تلقائيًا لاحقًا في هذه الوحدة.
  • عند إنشاء جدول، يمكن توفير قيمة افتراضية لعمود، وسيتم استخدام هذه القيمة إذا تم تحديد DEFAULT.
  • إذا تم تعريف عمود للسماح بالقيم NULL، ولم يكن العمود عمودًا تم إنشاؤه تلقائيًا ولم يكن له تعريف افتراضي، سيتم إدراج NULL على أنها DEFAULT.

تفاصيل إنشاء جدول خارج نطاق هذه الوحدة. ومع ذلك، غالبًا ما يكون مفيدًا لمعرفة الأعمدة الموجودة في جدول. أسهل طريقة هي تنفيذ عبارة SELECT على الجدول دون إرجاع أي صفوف. باستخدام شرط WHERE الذي لا يمكن أن يكون بالقيمة TRUE مطلقًا، يمكن إرجاع أي صفوف.

SELECT * FROM Sales.Promotion
WHERE 1 = 0;

ستعرض لك هذه العبارة كل الأعمدة وأسمائها، ولكنها لن تعرض أنواع البيانات أو أي خصائص، مثل ما إذا كانت القيم NULL مسموح بها، أو إذا كانت هناك قيم افتراضية محددة. مثال الإخراج من الاستعلام قد يبدو كما يلي:

PromotionName

StartDate

ProductModelID

Discount

ملاحظات

لإدراج بيانات في هذا الجدول، يمكنك استخدام عبارة 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، وفي هذه الحالة سيتم استخدام القيمة الافتراضية إذا تم تعريفها، وإذا لم يكن هناك قيمة افتراضية ولكن العمود يسمح بالقيم NULL، فسيتم إدراج 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:

  • يمكنك اختياريًا تحديد قائمة أعمدة تتبع اسم الجدول.
  • يجب توفير قيم الأعمدة أو DEFAULT أو NULL لكل عمود.

يوضح بناء الجملة التالي استخدام INSERT SELECT:

INSERT [INTO] <table or view> [(column_list)]
SELECT <column_list> FROM <table_list>...;

إشعار

يمكن أيضًا استخدام مجموعات النتائج من الإجراءات المخزنة (أو حتى الدفعات الديناميكية) كإدخال إلى عبارة INSERT. هذا النموذج من INSERT، المسمى INSERT EXEC، هو من الناحية المفاهيمية مماثلاً لعبارة INSERT SELECT وسيقدم نفس الاعتبارات. ومع ذلك، يمكن للإجراءات المخزنة إرجاع مجموعات نتائج متعددة، لذلك هناك حاجة إلى مزيد من العناية.

يدرج المثال التالي صفوف متعددة لترويج جديد يسمى Get Framed عن طريق استرداد معرف النموذج واسم النموذج من Production.ProductModel، جدول لكل نموذج يحتوي على الكلمة "frame" باسمه.

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. سيكون لكل عمود في الجدول الجديد نفس الاسم ونوع البيانات وقابلية الإبطال مثل العمود المتوافق (أو التعبير) في قائمة SELECT.

لاستخدام SELECT INTO، عليك إضافة INTO <new_table_name> في جملة SELECT للاستعلام، قبل جملة FROM بالضبط. فيما يلي مثال يستخرج البيانات من جدول Sales.SalesOrderHeader إلى جدول جديد يسمى Sales.Invoice..

SELECT SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue
INTO Sales.Invoice
FROM Sales.SalesOrderHeader;

ستفشل SELECT INTO إذا كان هناك بالفعل جدول بالاسم المحدد بعد INTO. بعد إنشاء الجدول، يمكن معاملته مثل أي جدول آخر. يمكنك التحديد منه، أو ضمه إلى جداول أخرى، أو إدراج صفوف أخرى فيه.