آشنایی با Output Clause در SQL Server
Output Clause در SQL Server روشی برای دریافت اطلاعات رکوردهای درج، ویرایش یا حذفشده و ثبت تغییرات دادهها است.
آشنایی با Output Clause در SQL Server
در SQL Server، یکی از قابلیتهای بسیار کاربردی که بسیاری از برنامهنویسان و مدیران پایگاه داده از آن غافل هستند، Output Clause است.
این قابلیت به شما اجازه میدهد هنگام اجرای دستورات INSERT، UPDATE، DELETE و MERGE، اطلاعات رکوردهای تغییر یافته را بدون نیاز به اجرای یک Query جداگانه دریافت کنید.
به کمک Output Clause میتوان اطلاعات قبل و بعد از تغییرات را مشاهده کرد، گزارش تهیه نمود، عملیات Audit انجام داد، دادهها را در جدول دیگری ذخیره کرد و حتی از آن برای ثبت لاگ تغییرات استفاده نمود.
🌟 آیا میخواهید به یک متخصص پایگاه داده تبدیل شوید و در دنیای فناوری اطلاعات بدرخشید؟
با دوره آموزشی SQL Server ما، شما میتوانید به راحتی و با روشی عملی، تمام مهارتهای لازم را یاد بگیرید!
این دوره به شما آموزش میدهد که چگونه دادهها را به بهترین شکل مدیریت کنید، گزارشهای قدرتمند بسازید و به تحلیلهای عمیق دست یابید.
با محتوای جذاب و پروژههای واقعی، شما نه تنها تئوری را یاد میگیرید، بلکه تواناییهای عملی خود را نیز تقویت میکنید.
پس فرصت را از دست ندهید! همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آینده شغلی روشنتر بردارید!
⇐همین حالا شروع کنید و به دنیای دادهها بپیوندید!
Output Clause چیست؟
Output Clause قابلیتی در SQL Server است که نتیجه عملیات تغییر دادهها (Data Modification) را به صورت مستقیم برمیگرداند.
به عبارت دیگر، هنگامی که یک دستور INSERT، UPDATE یا DELETE اجرا میشود، SQL Server اطلاعات رکوردهای درگیر را در دو جدول منطقی قرار میدهد:
- INSERTED
- DELETED
Output Clause میتواند اطلاعات این دو جدول را نمایش دهد یا در جدول دیگری ذخیره کند.
مزایای Output Clause در SQL Server
استفاده از Output Clause مزایای فراوانی دارد:
-
کاهش تعداد Queryها
-
افزایش سرعت اجرای برنامه
-
ثبت تغییرات به صورت خودکار
-
مناسب برای سیستمهای حسابداری
-
مناسب برای سیستمهای مالی
-
امکان مشاهده مقدار قبلی و مقدار جدید
-
جلوگیری از اجرای Query اضافی
-
مناسب برای تهیه گزارش تغییرات
-
امکان ذخیره لاگ تغییرات

ساختار کلی Output Clause در SQL Server
ساختار کلی آن به شکل زیر است:
INSERT ...
OUTPUT ...
VALUES (...)
یا
UPDATE ...
SET ...
OUTPUT ...
WHERE ...
یا
DELETE ...
OUTPUT ...
WHERE ...
جدول INSERTED چیست؟
جدول منطقی INSERTED شامل اطلاعات جدید رکوردها است.
در دستورات زیر قابل استفاده است:
- INSERT
- UPDATE
- MERGE
مثال:
OUTPUT INSERTED.*
جدول DELETED چیست؟
جدول DELETED اطلاعات قبلی رکوردها را نگهداری میکند.
در دستورات زیر استفاده میشود:
- DELETE
- UPDATE
- MERGE
مثال:
OUTPUT DELETED.*
استفاده از Output در دستور INSERT
فرض کنید جدول زیر را داریم:
CREATE TABLE Employees
(
Id INT IDENTITY,
FullName NVARCHAR(100),
Salary INT
)
اکنون اطلاعات جدید وارد میکنیم.
INSERT INTO Employees
(
FullName,
Salary
)
OUTPUT INSERTED.*
VALUES
(
'Ali Ahmadi',
15000000
);
خروجی:
| Id | FullName | Salary |
| 1 | Ali Ahmadi | 15000000 |
بدون اجرای SELECT، اطلاعات درج شده نمایش داده میشود.
دریافت فقط شناسه ایجاد شده
گاهی فقط مقدار Identity نیاز است.
INSERT INTO Employees
(
FullName,
Salary
)
OUTPUT INSERTED.Id
VALUES
(
'Sara',
20000000
);
خروجی
2
این روش از استفاده از SCOPE_IDENTITY() نیز در بسیاری از سناریوها انعطافپذیرتر است، بهویژه زمانی که چندین ردیف بهصورت همزمان درج میشوند.
استفاده از Output در UPDATE
فرض کنید حقوق کارمندان افزایش پیدا کند.
UPDATE Employees
SET Salary += 3000000
OUTPUT
DELETED.Salary,
INSERTED.Salary
WHERE Id=1;
خروجی
| حقوق قبلی | حقوق جدید |
| 15000000 | 18000000 |
مشاهده اطلاعات قبل و بعد از تغییر
میتوان اطلاعات کامل را دریافت کرد.
UPDATE Employees
SET Salary=25000000
OUTPUT
DELETED.FullName,
DELETED.Salary,
INSERTED.Salary
WHERE Id=1;
خروجی
| نام | حقوق قبلی | حقوق جدید |
| Ali Ahmadi | 18000000 | 25000000 |
استفاده در DELETE
DELETE Employees
OUTPUT DELETED.*
WHERE Id=1;
قبل از حذف، اطلاعات رکورد نمایش داده میشود.
ذخیره خروجی داخل جدول دیگر
یکی از جذابترین قابلیتهای Output، ذخیره اطلاعات در جدول دیگر است.
ابتدا جدول لاگ را ایجاد میکنیم.
CREATE TABLE EmployeeLog
(
EmployeeId INT,
FullName NVARCHAR(100),
Salary INT
)
اکنون:
DELETE Employees
OUTPUT
DELETED.Id,
DELETED.FullName,
DELETED.Salary
INTO EmployeeLog
WHERE Id=3;
رکورد حذف شده داخل جدول لاگ ذخیره خواهد شد.
استفاده در UPDATE همراه با ذخیره لاگ
UPDATE Employees
SET Salary +=1000000
OUTPUT
DELETED.Id,
DELETED.Salary,
INSERTED.Salary
INTO SalaryHistory
WHERE Salary<10000000;
این روش برای ثبت تاریخچه تغییرات حقوق بسیار کاربردی است.
استفاده از Output در INSERT چند رکوردی
INSERT Employees
(
FullName,
Salary
)
OUTPUT INSERTED.*
VALUES
('Ali',12000000),
('Sara',14000000),
('Reza',18000000);
تمام رکوردهای درج شده نمایش داده میشوند.
استفاده در MERGE
Output در دستور MERGE بسیار قدرتمند است.
MERGE Employees AS T
USING NewEmployees AS S
ON T.Id=S.Id
WHEN MATCHED THEN
UPDATE SET
T.Salary=S.Salary
WHEN NOT MATCHED THEN
INSERT
(
FullName,
Salary
)
VALUES
(
S.FullName,
S.Salary
)
OUTPUT
$action,
INSERTED.*,
DELETED.*;
ستون $action مشخص میکند که عملیات انجامشده از نوع INSERT، UPDATE یا DELETE بوده است.
کاربرد Output Clause در سیستمهای حسابداری
تقریباً تمام نرمافزارهای مالی از Output استفاده میکنند.
مثلاً:
-
ثبت تغییر موجودی
-
ثبت تغییر قیمت
-
ثبت تغییر حسابها
-
ثبت حذف اسناد
-
ذخیره لاگ کاربران

کاربرد Output Clause در سیستمهای فروشگاهی
فرض کنید کالا ویرایش شود.
UPDATE Products
SET Price=650000
OUTPUT
DELETED.Price,
INSERTED.Price
WHERE Id=10;
قیمت قبلی و جدید ذخیره میشود.
استفاده برای Audit
بسیاری از شرکتها تمام تغییرات کاربران را ثبت میکنند.
Output بهترین ابزار برای این کار است.
مثلاً:
- چه کسی تغییر داد؟
- چه زمانی تغییر داد؟
- مقدار قبلی چه بود؟
- مقدار جدید چیست؟
ثبت تاریخچه تغییرات
فرض کنید جدول زیر وجود دارد.
PriceHistory
هر بار قیمت تغییر کند:
UPDATE Products
SET Price=900000
OUTPUT
INSERTED.Id,
DELETED.Price,
INSERTED.Price,
GETDATE()
INTO PriceHistory;
اکنون تمام تاریخچه قیمتها ذخیره خواهد شد.
استفاده همراه با Table Variable
میتوان خروجی را در یک متغیر جدولی ذخیره کرد.
DECLARE @Result TABLE
(
Id INT,
Name NVARCHAR(100)
)
INSERT Employees
OUTPUT
INSERTED.Id,
INSERTED.FullName
INTO @Result
VALUES
('Mohammad',12000000);
SELECT *
FROM @Result;
این روش زمانی مفید است که بخواهید از نتایج عملیات در ادامه همان اسکریپت استفاده کنید.
تفاوت Output با SELECT در SQL Server
بسیاری از افراد بعد از INSERT یک SELECT اجرا میکنند.
مثلاً:
INSERT ...
SELECT ...
اما Output:
- سریعتر است.
- فقط رکوردهای تغییر یافته را برمیگرداند.
- نیاز به Query اضافی ندارد.
- خوانایی کد را افزایش میدهد.
تفاوت Output با Trigger
برخی تصور میکنند Output جایگزین Trigger است، اما این دو کاربردهای متفاوتی دارند.
| Clause Trigger | Output |
| در همان دستور اجرا میشود | بعد از اجرای دستور فعال میشود |
| سادهتر است | پیچیدهتر است |
| سریعتر است | ممکن است سربار بیشتری ایجاد کند |
| مناسب دریافت اطلاعات | مناسب اجرای منطقهای پیچیده |
در بسیاری از سناریوها، استفاده از Output برای ثبت اطلاعات ساده و گزارش تغییرات، از Trigger سبکتر و قابلفهمتر است.
محدودیتهای Output Clause
هرچند Output قابلیت قدرتمندی است، اما محدودیتهایی نیز دارد:
- استفاده نادرست از آن در عملیات حجیم میتواند حجم خروجی زیادی تولید کند.
- در برخی سناریوهای پیچیده همراه با Triggerها یا Viewهای خاص باید با دقت بیشتری استفاده شود.
- هنگام ذخیره خروجی در جدول مقصد، ساختار ستونها باید با دادههای خروجی سازگار باشد.
بهترین روشهای استفاده Output Clause
برای بهرهگیری بهتر از Output Clause، این نکات را رعایت کنید:
- تنها ستونهای موردنیاز را در بخش OUTPUT انتخاب کنید.
- برای ثبت لاگ، از OUTPUT INTO استفاده کنید.
- در عملیات گروهی، نتایج را در جدول موقت یا Table Variable ذخیره کنید.
- برای سیستمهای حساس، خروجی را همراه با زمان و شناسه کاربر ثبت کنید.
- از ترکیب Output با تراکنشها (Transactions) برای حفظ یکپارچگی دادهها بهره ببرید.

جمعبندی
Output Clause یکی از قابلیتهای ارزشمند SQL Server برای مشاهده و ثبت اطلاعات رکوردهای تغییر یافته است.
این ویژگی امکان دریافت مقادیر قبل و بعد از تغییر، ذخیره خروجی در جدولهای لاگ، ثبت تاریخچه تغییرات و حذف نیاز به اجرای Queryهای اضافی را فراهم میکند.
در پروژههای واقعی مانند نرمافزارهای مالی، فروشگاهی، منابع انسانی و سیستمهای مدیریت داده، استفاده از Output Clause باعث افزایش کارایی، سادهتر شدن کدنویسی و بهبود قابلیت ردیابی تغییرات میشود.
اگر در برنامههای خود نیاز به ثبت یا بررسی تغییرات دادهها دارید، Output Clause یکی از بهترین ابزارهای داخلی SQL Server برای انجام این کار است.

کاربران ما
شما هم نظرتون با ما دریاره “آشنایی با Output Clause در SQL Server” اشتراک بزارید
برای ارسال نظر لطفا ورود یا ثبت نام کنید