درج داده در SQL Server: راهنمای کامل دستور insert into با مثالهای کاربردی
دستور SQL `INSERT INTO` برای افزودن ردیفهای جدید داده به یک جدول استفاده میشود. روشهای مختلفی برای استفاده از دستور `INSERT INTO` جهت درج داده در یک جدول وجود دارد که در ادامه آنها را نشان خواهیم داد.
یکی از رایجترین روشها برای افزودن داده، درج در جدولی است که تمام ستونهای آن به صراحت نام برده شدهاند. در این حالت، شما مقادیری را برای هر ستون به ترتیبی که آنها را در دستور `INSERT` لیست کردهاید، ارائه میدهید. این روش اطمینان میدهد که دادهها به ستونهای صحیح وارد میشوند، حتی اگر ترتیب ستونها در جدول تغییر کند. برای مثال، فرض کنید جدولی به نام `Product` داریم و میخواهیم یک رکورد جدید با `ProductId`، `Name` و `Price` مشخص در آن درج کنیم:
CREATE TABLE Product ( ProductId INT, Name VARCHAR(50), Price DECIMAL(10,2) )
INSERT INTO Product (ProductId, Name, Price) VALUES (1, 'Laptop', 1200.00)
SELECT * FROM Product
روش دیگر این است که تمام ستونها را به صراحت نام نبرید. این روش مقادیر را به ترتیب فیزیکی ستونها در جدول درج میکند. **هشدار**: این روش توصیه نمیشود، زیرا اگر ترتیب ستونها در جدول تغییر کند یا ستونهای جدیدی اضافه شوند، ممکن است عملیات درج با شکست مواجه شود یا دادهها به اشتباه درج شوند. مثال زیر نشان میدهد که چگونه یک رکورد جدید بدون نام بردن از ستونها درج میشود:
INSERT INTO Product VALUES (2, 'Mouse', 25.00)
SELECT * FROM Product
گاهی اوقات ممکن است لازم باشد فقط در زیرمجموعهای از ستونها داده درج کنید. در این حالت، باید ستونهایی را که میخواهید داده به آنها اضافه کنید، به صراحت نام ببرید و سپس مقادیر مربوطه را ارائه دهید. ستونهایی که نام برده نمیشوند، مقادیر پیشفرض خود را میگیرند یا اگر مقدار پیشفرض نداشته باشند و `NULL` پذیر باشند، `NULL` خواهند شد. برای درج داده فقط در ستونهای `ProductId` و `Name`، از این روش استفاده میکنیم:
INSERT INTO Product (ProductId, Name) VALUES (3, 'Keyboard')
SELECT * FROM Product
در SQL Server، میتوانید چندین ردیف داده را در یک دستور `INSERT INTO` واحد اضافه کنید که کارایی را بهبود میبخشد و کد را خواناتر میکند. مثال زیر نحوه درج چندین رکورد به طور همزمان را نشان میدهد:
INSERT INTO Product (ProductId, Name, Price) VALUES
(4, 'Monitor', 300.00),
(5, 'Webcam', 75.00),
(6, 'Microphone', 50.00)
SELECT * FROM Product
روش دیگری برای درج چندین ردیف در یک جدول وجود دارد که از دستور `SELECT` در کنار `INSERT` استفاده میکند. این روش کمتر رایج است و ممکن است برای سناریوهای خاصی مناسب باشد. برای درج چند ردیف با استفاده از `UNION ALL` در یک دستور `SELECT`، کد زیر را مشاهده کنید:
INSERT INTO Product (ProductId, Name, Price)
SELECT 7, 'Headphones', 150.00 UNION ALL
SELECT 8, 'USB Drive', 15.00 UNION ALL
SELECT 9, 'External Hard Drive', 100.00
SELECT * FROM Product
ستونهای `IDENTITY` به طور خودکار مقادیر عددی منحصر به فردی را تولید میکنند. به طور پیشفرض، نمیتوانید مستقیماً در این ستونها داده درج کنید. برای انجام این کار، باید ابتدا تنظیم `IDENTITY_INSERT` را برای جدول روی `ON` قرار دهید. مثال زیر نحوه درج دستی یک مقدار در ستون `IDENTITY` را نشان میدهد:
DROP TABLE Product
CREATE TABLE Product (
ProductId INT IDENTITY(1,1),
Name VARCHAR(50),
Price DECIMAL(10,2)
)
SET IDENTITY_INSERT Product ON
INSERT INTO Product (ProductId, Name, Price) VALUES (10, 'Router', 80.00)
SET IDENTITY_INSERT Product OFF
SELECT * FROM Product
یکی از قابلیتهای قدرتمند `INSERT INTO`، امکان درج دادهها از یک جدول دیگر است. این ویژگی برای کپی کردن دادهها، بایگانی کردن یا انتقال آنها بین جداول بسیار مفید است. برای درج داده از جدول `OldProduct` به جدول `Product` بر اساس شرط `ProductId = 1`، از دستور زیر استفاده میکنیم:
CREATE TABLE OldProduct ( ProductId INT, Name VARCHAR(50), Price DECIMAL(10,2) )
INSERT INTO OldProduct (ProductId, Name, Price) VALUES (1, 'Old Laptop', 1000.00)
INSERT INTO OldProduct (ProductId, Name, Price) VALUES (2, 'Old Monitor', 200.00)
DROP TABLE Product
CREATE TABLE Product ( ProductId INT, Name VARCHAR(50), Price DECIMAL(10,2) )
INSERT INTO Product (ProductId, Name, Price)
SELECT ProductId, Name, Price FROM OldProduct
WHERE ProductId = 1
SELECT * FROM Product
هنگام درج دادههای تاریخ (DATE) در یک جدول SQL Server، مهم است که فرمت تاریخ را به درستی رعایت کنید. SQL Server از فرمتهای مختلفی پشتیبانی میکند، اما فرمت استاندارد `YYYY-MM-DD` یا `YYYY-MM-DD HH:MM:SS` توصیه میشود. برای درج تاریخ `2023-10-26` به عنوان `OrderDate` در جدول `Product`، کد زیر را مشاهده کنید:
DROP TABLE Product
CREATE TABLE Product ( ProductId INT, Name VARCHAR(50), OrderDate DATE )
INSERT INTO Product (ProductId, Name, OrderDate) VALUES (1, 'New Gadget', '2023-10-26')
SELECT * FROM Product
میتوانید خروجی یک Stored Procedure را مستقیماً به یک جدول درج کنید. این روش برای پر کردن جداول موقت یا ذخیرهسازی نتایج پیچیده یک رویه ذخیره شده بسیار کارآمد است. برای درج خروجی رویه ذخیره شده `GetHighPricedProducts` در جدول `Product`، از دستور زیر استفاده میکنیم:
DROP TABLE Product
CREATE TABLE Product ( ProductId INT, Name VARCHAR(50), Price DECIMAL(10,2) )
GO
CREATE PROCEDURE GetHighPricedProducts
AS
BEGIN
SELECT 11, 'Expensive Item', 500.00
UNION ALL
SELECT 12, 'Premium Service', 1500.00
END
GO
INSERT INTO Product (ProductId, Name, Price)
EXEC GetHighPricedProducts
SELECT * FROM Product
دستور `OUTPUT` در SQL Server به شما امکان میدهد اطلاعاتی درباره ردیفهایی که تحت تأثیر یک دستور `INSERT`، `UPDATE` یا `DELETE` قرار گرفتهاند، بازیابی کنید. این قابلیت برای لاگبرداری، auditing یا انجام عملیات بعدی بر روی دادههای تغییر یافته بسیار مفید است. مثال زیر نحوه استفاده از `OUTPUT` برای درج داده در جدول `Product` و همزمان ثبت اطلاعات ردیفهای درج شده در جدول `InsertedProductsLog` را نشان میدهد:
DROP TABLE Product
CREATE TABLE Product ( ProductId INT, Name VARCHAR(50), Price DECIMAL(10,2) )
CREATE TABLE InsertedProductsLog (
LogId INT IDENTITY(1,1),
ProductId INT,
Name VARCHAR(50),
Price DECIMAL(10,2),
InsertDate DATETIME DEFAULT GETDATE()
)
INSERT INTO Product (ProductId, Name, Price)
OUTPUT INSERTED.ProductId, INSERTED.Name, INSERTED.Price
INTO InsertedProductsLog (ProductId, Name, Price)
VALUES (13, 'Smartwatch', 250.00), (14, 'Fitness Tracker', 90.00)
SELECT * FROM Product
SELECT * FROM InsertedProductsLog