PDA

View Full Version : ریست کردن یک دیتابیس اس کیو ال اکسپرس با استور پروسیجر



quantomquery
جمعه 03 دی 1389, 20:35 عصر
سلام

من یه دیتابیس برای برنامم تو اکسپرس ساختم
که چند تا جدول و ..... داره

میخوام با استور پروسیجر ، کل اطلاعات دیتابیس پاک بشه و شبیه اولش بشه

توجه : دلیت عادی نشه چون بعضی از اتوماتیک نامبر هام فعاله میخوام اونها هم از این به بعد از 1 استارت بزنن

یعنی طوری بشه که همون اول ساختمش

ریست بشه .

اگه می تونین کمکم کنید از چه کدی استفاده کنم ؟

ممنون

Reza_Yarahmadi
شنبه 04 دی 1389, 09:12 صبح
يكي از روشهايي كه ميتونيد اين كار رو انجام بديد:


Declare @Name varchar(max)
,@Str varchar(max)
Declare _Cursor Cursor
For Select Name From Sys.Objects Where Type = 'U'
Open _Cursor
Fetch Next From _Cursor Into @Name
While(@@Fetch_Status = 0 )
Begin
Set @Str = 'TRUNCATE TABLE ' + @Name
exec SP_SQLExec @Str
Fetch Next From _Cursor Into @Name
End
Close _Cursor
Deallocate _Cursor

quantomquery
شنبه 04 دی 1389, 17:02 عصر
يكي از روشهايي كه ميتونيد اين كار رو انجام بديد:


Declare @Name varchar(max)
,@Str varchar(max)
Declare _Cursor Cursor
For Select Name From Sys.Objects Where Type = 'U'
Open _Cursor
Fetch Next From _Cursor Into @Name
While(@@Fetch_Status = 0 )
Begin
Set @Str = 'TRUNCATE TABLE ' + @Name
exec SP_SQLExec @Str
Fetch Next From _Cursor Into @Name
End
Close _Cursor
Deallocate _Cursor


سلام
میشه درباره این چند خط کد توضیح بدین که چکار می کنن - یعنی اینکه مثلا خط 6 چکار میکنه و ...
ممنون

Reza_Yarahmadi
شنبه 04 دی 1389, 18:10 عصر
کار خاصی انجام نمیده ، نام جدولهای رو میخونه و به ازا هر نام (با استفاده از کرسر) دستور TRUNCATE رو اجرا میکنه.
در رابطه با کرسر و دستور TRUNCATE بصورت کامل توی سایت توضیح داده شده با یک جستجو میتونید اطلاعات کاملی در این زمینه کسب کنید.
برای پیدا کردن نام جدولهای یک بانک میشه از دستور زیر استفاده کرد

Select * From Sys.Objects Where Type = 'U'
مواقعی که بخواهیم دستوری رو اجرا کنیم که نام جدول اون متغیره ، مجبوریم دست به دامن Dynamic Query بشیم. در این مثال هم چون اسم جدولها متغیر است از روش زیر برای اجرای دستور استفاده شده

Set @Str = 'TRUNCATE TABLE ' + @Name
exec SP_SQLExec @Str
بقیه کد هم دستورات استفاده از کرسر است که با همون جستجو ابهاماتتون برطرف میشه.

حمیدرضاصادقیان
یک شنبه 05 دی 1389, 08:07 صبح
این کد ایرادی نداره. فقط اگر جداول شما FK داشته باشه اونوقت اجرا نخواهد شد و به شما پیغام خطا خواهد داد که باید ابتدا اون Relation رو از بین ببرید بعد این دستور رو اجرا کنید.

Reza_Yarahmadi
یک شنبه 05 دی 1389, 08:28 صبح
حواسم به رابطه بين جداول نبود!!
كد اصلاح شده:

Declare @Name varchar(max)
,@Str varchar(max)
,@TableName varchar(max)
Declare _Cursor Cursor
For Select O.Name, O2.Name From sys.Objects O inner join sys.Objects O2
On O.Parent_Object_Id = O2.Object_Id Where O.Type= 'F'
Open _Cursor
Fetch Next From _Cursor Into @Name, @TableName
While(@@Fetch_Status = 0 )
Begin
Set @Str = 'ALTER TABLE dbo.' + @TableName + ' DROP CONSTRAINT ' + @Name
exec SP_SQLExec @Str
Fetch Next From _Cursor Into @Name, @TableName
End
Close _Cursor
Deallocate _Cursor

Declare _Cursor Cursor
For Select Name From Sys.Objects Where Type = 'U'
Open _Cursor
Fetch Next From _Cursor Into @Name
While(@@Fetch_Status = 0 )
Begin
Set @Str = 'TRUNCATE TABLE ' + @Name
exec SP_SQLExec @Str
Fetch Next From _Cursor Into @Name
End
Close _Cursor
Deallocate _Cursor

quantomquery
دوشنبه 06 دی 1389, 08:24 صبح
حواسم به رابطه بين جداول نبود!!
كد اصلاح شده:

Declare @Name varchar(max)
,@Str varchar(max)
,@TableName varchar(max)
Declare _Cursor Cursor
For Select O.Name, O2.Name From sys.Objects O inner join sys.Objects O2
On O.Parent_Object_Id = O2.Object_Id Where O.Type= 'F'
Open _Cursor
Fetch Next From _Cursor Into @Name, @TableName
While(@@Fetch_Status = 0 )
Begin
Set @Str = 'ALTER TABLE dbo.' + @TableName + ' DROP CONSTRAINT ' + @Name
exec SP_SQLExec @Str
Fetch Next From _Cursor Into @Name, @TableName
End
Close _Cursor
Deallocate _Cursor

Declare _Cursor Cursor
For Select Name From Sys.Objects Where Type = 'U'
Open _Cursor
Fetch Next From _Cursor Into @Name
While(@@Fetch_Status = 0 )
Begin
Set @Str = 'TRUNCATE TABLE ' + @Name
exec SP_SQLExec @Str
Fetch Next From _Cursor Into @Name
End
Close _Cursor
Deallocate _Cursor

این برای کل جداول عمل می کنه

اگه بخوام فقط رو یه جدول انجام بدم مثلا روی tbl1 اونوقت چطور باید بنویسم

ممنون

حمیدرضاصادقیان
دوشنبه 06 دی 1389, 08:29 صبح
سلام.
دوست عزیز مقداری هم خودتون زحمت بکشید اینکه دیگه کاری نداره.
ابتدا این خط رو اجرا میکنید.


Declare @Name varchar(max)
,@Str Varchar(MAX)
Select @Name=O.Name, O2.Name From sys.Objects O inner join sys.Objects O2
On O.Parent_Object_Id = O2.Object_Id Where O.Type= 'F'
set @Str='ALTER TABLE dbo.tbl1 DROP CONSTRAINT '+@name
exec SP_SQLExec @Str

بعد هم این خط رو


truncate table tb1

Reza_Yarahmadi
دوشنبه 06 دی 1389, 08:41 صبح
اگه بخوام فقط رو یه جدول انجام بدم مثلا روی tbl1 اونوقت چطور باید بنویسم
اينطوري كه كار خيلي ساده تره
اگر كليدهاي جدولتون رو ميدونيد ميتونيد با يك دستور ساده بصورت زير اين كار رو انجام بديد

ALTER TABLE dbo.tbl1 DROP CONSTRAINT FK_1
ALTER TABLE dbo.tbl1 DROP CONSTRAINT FK_2
ALTER TABLE dbo.tbl1 DROP CONSTRAINT FK_3

TRUNCATE TABLE tbl1

در صورتي هم كه فقط اسم جدول رو داريد ميتونيد شرط نام جدول رو به جسجتوي اول اضافه كنيد.

Declare @Str varchar(max), @TableName varchar(max)
Set @TableName = 'YourTable'
Set @Str = ''

Select @Str = @Str +'
ALTER TABLE dbo.' + @TableName + ' DROP CONSTRAINT ' + O.Name
From
sys.Objects O inner join sys.Objects O2
On
O.Parent_Object_Id = O2.Object_Id
Where
O.Type= 'F'
AND
O2.Name = @TableName

Set @Str = @Str +'
TRUNCATE TABLE ' + @TableName

exec SP_SQLExec @Str
اين دستور اول تمام كليدهاي روي جدول مورد نظر رو پاك ميكنه بعد جدول رو ريست ميكنه (بدون استفاده از كرسر)

quantomquery
چهارشنبه 20 بهمن 1389, 16:02 عصر
اينطوري كه كار خيلي ساده تره
اگر كليدهاي جدولتون رو ميدونيد ميتونيد با يك دستور ساده بصورت زير اين كار رو انجام بديد

ALTER TABLE dbo.tbl1 DROP CONSTRAINT FK_1
ALTER TABLE dbo.tbl1 DROP CONSTRAINT FK_2
ALTER TABLE dbo.tbl1 DROP CONSTRAINT FK_3

TRUNCATE TABLE tbl1

در صورتي هم كه فقط اسم جدول رو داريد ميتونيد شرط نام جدول رو به جسجتوي اول اضافه كنيد.

Declare @Str varchar(max), @TableName varchar(max)
Set @TableName = 'YourTable'
Set @Str = ''

Select @Str = @Str +'
ALTER TABLE dbo.' + @TableName + ' DROP CONSTRAINT ' + O.Name
From
sys.Objects O inner join sys.Objects O2
On
O.Parent_Object_Id = O2.Object_Id
Where
O.Type= 'F'
AND
O2.Name = @TableName

Set @Str = @Str +'
TRUNCATE TABLE ' + @TableName

exec SP_SQLExec @Str
اين دستور اول تمام كليدهاي روي جدول مورد نظر رو پاك ميكنه بعد جدول رو ريست ميكنه (بدون استفاده از كرسر)


سلام

حالا می شه دوباره اون کلید ها رو ساخت؟
جدول پاک شد و لی الان دیگه کلید خارجی ندارم
بهتره اینطور بگم :
3 تا جدول دارم - با این دستور ها کلید خارجی شون به هم پاک شد و ریست شدن
حالا می تونم اون کلید هارو دوباره برگردونم ؟