|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我们分析上面的两个操作,都有一个“删除数据”的过程。工具|数据|数据库
原帖内容:
如何把数据库中一切数据删除,然后把一切的主动增量复位?
表太多,没法手工完成。
http://community.csdn.net/Expert/topic/3094/3094555.xml?temp=.2920954
/*
--底本盘算如许
--先禁用一切外键束缚
execsp_msforeachtable"altertable?nocheckCONSTRAINTall"
--然后删除数据
execsp_msforeachtable"truncatetable?"
--再启用一切外键束缚
execsp_msforeachtable"altertable?checkconstraintall"
--可是禁用了今后,truncatetable不可,会提醒抵触
*/
--如今我的设法是(语句待优化):
--第一部分,天生创建外键的语句保留到#tmp
declare@namevarchar(200),@tmp1varchar(500),@tmp2varchar(500)
createtable#tmp
(
stringvarchar(8000)
)
SELECT表称号=object_name(b.fkeyid)
,外键称号=a.name
,援用的列名=(SELECTnameFROMsyscolumnsWHEREcolid=b.fkeyANDid=b.fkeyid)
,援用的表名=object_name(b.rkeyid)
,已援用的列名=(SELECTnameFROMsyscolumnsWHEREcolid=b.rkeyANDid=b.rkeyid)
into#tFROMsysobjectsa
joinsysforeignkeysbona.id=b.constid
joinsysobjectscona.parent_obj=c.id
wherea.xtype=fANDc.xtype=U
declarecur_testcursorfor
selecta.namefromsysobjectsajoinsysobjectscona.parent_obj=c.idwherea.xtype=fandc.xtype=U
opencur_test
FETCHNEXTFROMcur_testINTO@name
WHILE(@@fetch_status-1)
BEGIN
IF(@@fetch_status-2)
BEGIN
select@tmp1=,@tmp2=
select@tmp1=@tmp1+[+援用的列名+],,@tmp2=@tmp2+[+已援用的列名+],from#twhere外键称号=@name
insertinto#tmpselecttop1ALTERTABLE[DBO].[+表称号+]ADDCONSTRAINT[+@name+]FOREIGNKEY(+left(@tmp1,len(@tmp1)-1)+)REFERENCES[+援用的表名+](+left(@tmp2,len(@tmp2)-1)+)from#twhere外键称号=@name
END
FETCHNEXTFROMcur_testINTO@name
END
CLOSEcur_test
DEALLOCATEcur_test
droptable#t
--第二部分,删除一切外键
DECLARE@STRINGVARCHAR(8000)
WHILEEXISTS(SELECTNAMEFROMSYSOBJECTSWHERETYPE=F)
BEGIN
SELECT@STRING=ALTERTABLE+B.NAME+DROPCONSTRAINT+A.NAME+CHAR(13)
FROM(SELECTPARENT_OBJ,NAMEFROMSYSOBJECTSWHERETYPE=F)A,
(SELECTID,NAMEFROMSYSOBJECTSWHEREOBJECTPROPERTY(ID,NISUSERTABLE)=1)B
WHEREA.PARENT_OBJ=B.ID
EXEC(@STRING)
END
--第三部分,删除一切表的纪录,而且把identity复位
execsp_msforeachtable"truncatetable?"
--第4部分,实行#tmp内里的创建外键的语句,恢复外键
declarecur_test2cursorforselectstringfrom#tmp
opencur_test2
FETCHNEXTFROMcur_test2INTO@string
WHILE(@@fetch_status-1)
BEGIN
IF(@@fetch_status-2)
BEGIN
exec(@string)
PRINT@STRING
END
FETCHNEXTFROMcur_test2INTO@string
END
CLOSEcur_test2
DEALLOCATEcur_test2
droptable#tmp
提供用于管理、检查、优化数据库操作的管理工具。 |
|