۱۳۸۸/۰۱/۱۰

حذف سريع تمام ركوردها در SQL server


فرض كنيد يك ديتابيس آزمايشي داريد كه مي‌خواهيد تمام ركوردهاي آن‌را حذف كنيد. اگر در اين ديتابيس انواع و اقسام كليدهاي خارجي و تريگر و امثال آن وجود داشته باشند، صرفا با يك دستور delete ساده كار به پايان نمي‌رسد و موفق به حذف ركوردها نخواهيد شد (چون اين قيد و بندها به همين جهت طراحي شده‌اند تا يكپارچگي ديتابيس حفظ شود).
اما اگر واقعا اين قيود در اين لحظه مهم نبودند و نياز بود تا تمام ركوردها را حذف كنيم، سريعترين راه حل موجود چيست؟

--Disable Constraints & Triggers
exec sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
exec sp_MSforeachtable 'ALTER TABLE ? DISABLE TRIGGER ALL'
--Perform delete operation on all table for cleanup
exec sp_MSforeachtable 'DELETE ?'
--Enable Constraints & Triggers again
exec sp_MSforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
exec sp_MSforeachtable 'ALTER TABLE ? ENABLE TRIGGER ALL'
--Reset Identity on tables with identity column
exec sp_MSforeachtable 'IF OBJECTPROPERTY(OBJECT_ID(''?''), ''TableHasIdentity'') = 1 BEGIN DBCC CHECKIDENT (''?'',RESEED,0) END'

اسكريپت فوق تمامي ركوردهاي ديتابيس جاري را حذف كرده و همچنين فيلدهاي identity را نيز مجددا به حالت اول باز مي‌گرداند.

توضيحات:
sp_Msforeachtable يكي از رويه‌هاي ذخيره شده‌ي سيستمي اس كيوال سرور مي‌باشد كه مستند نشده است. اگر نياز داشتيد كدي را بدون نوشتن يك كرسر و امثال آن، بر روي تمامي جداول اجرا كنيد مي‌توان از آن استفاده نمود.
امضاي اين رويه ذخيره شده به صورت زير است:

exec @RETURN_VALUE=sp_MSforeachtable @command1, @replacechar, @command2,
@command3, @whereand, @precommand, @postcommand

كه در آن:
RETURN_VALUE مقدار بازگشتي است.
Command1 اولين دستوري است كه اجرا خواهد شد (به همين ترتيب سپس Command2 و بعد از آن Command3 اجرا خواهد گرديد)
Replacechar كاراكتري است كه در دستور T-SQL مورد نظر جايگزين نام جدول خواهد شد. مقدار پيش فرض آن ? است.
Precommand پيش از پردازش عمليات روي هر جدولي اجرا مي‌شود.
Postcommand پس از اجراي كليه دستورات روي تمامي جداول، اجرا خواهد شد.

چند مثال:
نمايش تمامي جداول ديتابيس جاري
EXEC sp_MSforeachtable "print '?'"
نمايش اندازه‌ي جداول يك ديتابيس
EXEC sp_msforeachtable 'sp_spaceused ''?'''