Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 用外键截断表_Sql Server_Sql Server 2008_Tsql_Sql Server 2005_Sql Server 2008 R2 - Fatal编程技术网

Sql server 用外键截断表

Sql server 用外键截断表,sql-server,sql-server-2008,tsql,sql-server-2005,sql-server-2008-r2,Sql Server,Sql Server 2008,Tsql,Sql Server 2005,Sql Server 2008 R2,我有一个数据库有1000多个表。我正在创建新的空白设置。为此,我必须截断所有的表,但有些表我不想截断,所以我在表上创建并将名称存储在表中 ----------- Create hardcode table ---------------------- Create table TblHardCodeTableNotToTruncate(TableName varchar(100)) go insert into TblHardCodeTableNotToTrunc

我有一个数据库有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

但是我得到了错误外键引用错误。我知道在做之前我需要放弃约束。但有没有办法做到这一点,因为我不能删除然后截断,并再次添加这么多的表每次。我们是否可以在下面编写一个独特的脚本,如果存在,它将删除约束,截断表并将删除的约束再次添加到表中。

如果不删除约束,恐怕无法做到这一点, 您可以编写一个代码来提取表的约束并删除它们,这很简单

创建一个临时表,并使用此代码获取表约束,注意sysconstraints.status必须为1或3才能获取外键和主键:

Select  SysObjects.[Name] As "Constraint Name",
        Tabls.[Name] as "Table Name",
        Cols.[Name] As "Column Name"
From SysObjects Inner Join 
(Select [Name],[ID] From SysObjects) As Tabls
On Tabls.[ID] = Sysobjects.[Parent_Obj] 
Inner Join sysconstraints On sysconstraints.Constid = Sysobjects.[ID] 
Inner Join SysColumns Cols On Cols.[ColID] = sysconstraints.[ColID] 
And Cols.[ID] = Tabls.[ID]
where sysconstraints.status in (1, 3)
order by [Tabls].[Name] 

你必须在截断后重新创建这些约束,这也很简单,但我不会做你所有的工作:)

即使所有的表格都是空的,并且你禁用了所有约束,截断也会因为FK的存在而失败。你真的必须放下它

您可以创建一个脚本来自动化它(截断所有表,删除并重新创建FKs) 我在这里找到了一个(谨慎使用)


另外,如果您只想创建一个“毯子”数据库,您可以导出脚本来创建所有对象,并只填充您需要的少数(域?)表。

我想您正在寻找此脚本以启用、禁用、,根据主键表删除并重新创建FKs:我是空白的,请告诉我可以在循环中编写什么。这是一项非常复杂的工作,我过去曾这样做过(当然,我没有代码了),因为创建副本时必须存储删除的所有信息。为什么不能通过现有数据库生成的脚本创建数据库?它将重建结构。使用专门的软件。改为使用delete(注意日志大小:)-恐怖-请检查您的数据库可能没有关系-换句话说,您没有任何主键或外键…Mathese-我知道您的想法,但是我认为Jean想要一个他将来可以开发的代码,而不仅仅是删除数据/一次性截断表…
sysconstraints.status
需要是二进制的,并加上3来检查主键和外键位:
where sysconstraints.status&3 in(1,3)