PDA

View Full Version : مقدار برگشتی بعد از حذف



fakhravari
دوشنبه 11 دی 1391, 15:53 عصر
با سلام
DELETE FROM List WHERE ID=5
با دستور بالا چنتا رکورد حذف میشودن.
چطوری مقدار ID سطر های حذف شده را برگشت دهیم:متفکر:

hossein_h62
دوشنبه 11 دی 1391, 16:09 عصر
سلام
DELETE FROM List WHERE ID=5
Select @@ROWCOUNT

fakhravari
دوشنبه 11 دی 1391, 16:42 عصر
ممنون .
منظور من ID رکورد حذف شده است نه تعداد رکورد های اعمال شده/

mehdi.mousavi
دوشنبه 11 دی 1391, 16:52 عصر
با سلام
DELETE FROM List WHERE ID=5
با دستور بالا چنتا رکورد حذف میشودن.
چطوری مقدار ID سطر های حذف شده را برگشت دهیم:متفکر:


سلام.
در SQL Server 2005 به بعد، قابلیت جدیدی تحت عنوان Output Clause (http://msdn.microsoft.com/en-us/library/ms177564%28v=sql.110%29.aspx) اضافه شده که اطلاعات مورد نظر شما رو میتونه به شما برگردونه. فرضا:


DECLARE @MyDeletedRecords TABLE (
Id INT,
Col2 INT
);

DELETE FROM List
OUTPUT DELETED.* INTO @MyDeletedRecords
WHERE ID = 5

موفق باشید.

fakhravari
دوشنبه 11 دی 1391, 17:04 عصر
ممنون اقای موسوی اما یه مثال بزدین روی پست خودتون:گیج:

mehdi.mousavi
دوشنبه 11 دی 1391, 17:08 عصر
ممنون اقای موسوی اما یه مثال بزدین روی پست خودتون:گیج:

مثال رو نوشتم دیگه... :) پس از اجرای کد فوق، رکورد های حذف شده در متغیر @MyDeletedRecords قرار میگیرن.
در نتیجه پس از اجرای DELETE شما می تونید با مراجعه به @MyDeletedRecords (که باهاش مثل یک جدول عادی برخورد می کنید)
رکوردهای حذف شده رو بگیرید. طبیعتا باید تعریف MyDeletedRecords رو بر اساس جدول List تغییر بدید، الان من فرض کردم که
جدول مزبور دو ستون داره: ID و Col2...

موفق باشید.

fakhravari
دوشنبه 11 دی 1391, 17:16 عصر
اقای موسوی اینو ببینید
DECLARE @MyDeletedRecords TABLE (
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[RetID] [bigint] NULL,
[DatePost] [nvarchar](50) NULL
);

DELETE FROM Tb2
OUTPUT DELETED.* INTO @MyDeletedRecords
WHERE ID = 5

select * from @MyDeletedRecords
بعد اجرا خطای
Msg 8101, Level 16, State 1, Line 7
An explicit value for the identity column in table '@MyDeletedRecords' can only be specified when a column list is used and IDENTITY_INSERT is ON.

fakhravari
دوشنبه 11 دی 1391, 17:18 عصر
ممنون پیداش کردم
DECLARE @MyDeletedRecords TABLE (
[ID] [bigint] ,
[RetID] [bigint] NULL,
[DatePost] [nvarchar](50) NULL
);

DELETE FROM Tb2
OUTPUT DELETED.* INTO @MyDeletedRecords
WHERE [RetID] = 3

select * from @MyDeletedRecords

fakhravari
دوشنبه 11 دی 1391, 17:22 عصر
اقای موسوی این کد بالا کاربرد تریگر دارن فکر کنم :متفکر:

mehdi.mousavi
دوشنبه 11 دی 1391, 17:26 عصر
اقای موسوی این کد بالا کاربرد تریگر دارن فکر کنم :متفکر:

یعنی چی کاربرد Trigger داره؟ کد ذکر شده در پست شماره 8 کاملا Valid هستش و برای همین منظوری که شما در پی اون بودید، به کار میره.
حالا اینکه اینو در Stored Procedure ای به کار بگیرید، یا از اون در Trigger و ... استفاده کنید، به خود شما برمیگرده.

موفق باشید.

fakhravari
دوشنبه 11 دی 1391, 17:32 عصر
اره بحثی در اون نیست.
میگم چون از OUTPUT DELETED.* استفاده کرده.
و در تریگر از این روش هست .
inserted
updated
deleted
فکر کنم اون روش داره اینو پیاده میکن

mehdi.mousavi
دوشنبه 11 دی 1391, 17:49 عصر
اره بحثی در اون نیست.
میگم چون از OUTPUT DELETED.* استفاده کرده.
و در تریگر از این روش هست .
inserted
updated
deleted
فکر کنم اون روش داره اینو پیاده میکن

اینکه این Token ها هم اسم هستن مطلبی در مورد نحوه پیاده سازی اونها در Engine به ما نمیگه. درسته، از نظر اسمی شباهت دارن،
اما این OUTPUT CLAUSE یه چیزه، اون جدول های INSERTED و DELETED در Trigger ها چیز دیگه ای (ضمن اینکه چیزی به اسم UPDATED نداریم،
در واقع رکوردهای Update شده رکورد هایی هستن که تواما در جدول INSERTED هستن و هم در جدول DELETED).

جدول های مزبور در طول اجرای Trigger تغییر ناپذیرن، اما OUTPUT CLAUSE میتونه به ازای Query های متفاوت در یک Trigger، مقادیر INSERTED/DELETED
متفاوتی بهتون برگردونه. به بیان دیگه، Scope این دو نیز متفاوته... در هر حال، گمان نمی کنم پیدا کردن شباهت بین پیاده سازی این دو کمکی بهمون کنه. :)