【发布时间】:2014-01-07 15:40:03
【问题描述】:
我有一个包含 1000 多个表的数据库。我正在创建新的空白设置。为此,我必须截断所有表,但有些表我不想截断,所以我在表上创建并将名称存储在表中。
----------- Create hardcode table ----------------------
Create table TblHardCodeTableNotToTruncate(TableName varchar(100))
go
insert into TblHardCodeTableNotToTruncate
select 'TblHardCodeTableNotToTruncate'
go
---- insert the table names which dont wish to truncate ------------
Insert into TblHardCodeTableNotToTruncate
select 'TblAccount'
go
Insert into TblHardCodeTableNotToTruncate
select 'TblCity'
go
等,以下是我用来截断除这些插入表之外的所有表的查询
------------------------- Truncate all the tables except the tables specified in the Hardcode table -------------------------
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL'
GO
DECLARE @TBLTEMP TABLE(TABLENAME VARCHAR(100))
insert into @TBLTEMP
select name from sysobjects where xtype = 'U'
delete from @TBLTEMP where tablename in (
select tablename from TblHardCodeTableNotToTruncate)
DECLARE @SQLQUERY VARCHAR(MAX) =''
DECLARE @INTCNT INT = 1
DECLARE @TABLENAME VARCHAR(100) =''
WHILE (SELECT COUNT(*) FROM @TBLTEMP) > 0
BEGIN
select top 1 @TABLENAME = TABLENAME from @TBLTEMP
SET @SQLQUERY = 'Truncate table ' + @TABLENAME
EXEC(@SQLQUERY)
PRINT @SQLQUERY
DELETE FROM @TBLTEMP WHERE TABLENAME = @TABLENAME
END
go
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL'
go
但我得到错误外键引用错误。我知道我需要在做之前放弃约束。但是有什么办法可以做到这一点,因为我不能删除然后截断并每次添加这么多表。我们可以在下面编写任何独特的脚本,如果存在则删除约束,截断表并将删除的约束再次添加到表中。
【问题讨论】:
-
我想你正在寻找这个脚本来启用、禁用、删除和重新创建基于主键表的 FK:mssqltips.com/sqlservertip/1376/…
-
我是空白的你能告诉我我可以在我的while循环中写什么
标签: sql-server sql-server-2008 tsql sql-server-2005 sql-server-2008-r2