1

我有一個數據庫有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 

等,以下是我用來截斷除了這些inserted表

------------------------- 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 

所有表查詢,但我得到的錯誤外鍵引用錯誤。我知道在做之前我需要放棄約束。但有沒有辦法做到這一點,因爲我不能刪除然後截斷,並再次添加這麼多的表。是否有任何獨特的腳本可以在下面寫入,如果存在,則會刪除約束,截斷表並將再次刪除的約束再次添加到表中。

+0

我想你正在尋找這個腳本來啓用,禁用,刪除和重新創建基於主鍵表的FKs:http://www.mssqltips.com/sqlservertip/1376/disable-enable-drop-and-recreate- sql-server-foreign-keys/ – Deepshikha

+0

我是空白的,你可以告訴我什麼我可以在我的while循環中寫入 –

回答

3

恐怕沒有辦法解決這個問題, 你可以編寫一個代碼來提取表的約束條件,並且很簡單。

創建一個臨時表,並使用此代碼來獲取表的約束,並注意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] 

你會不得不重新創建這些約束再截斷後,這也很簡單,但我不會做所有的工作:)

+1

我運行這個選擇查詢並顯示0行 –

+0

這是一個非常複雜的工作要做,我過去做過(當然,我沒有這個代碼),因爲你必須存儲你正在刪除的所有信息來創建一個副本。爲什麼不能通過現有數據生成的腳本創建數據庫?它會重新創建結構。使用專門的軟件。使用刪除來代替(照顧日誌大小:)) –

+0

恐怖 - 請檢查您的數據庫可能是不相關的換句話說,你沒有任何主鍵或外鍵... –

0

即使所有表都是空的,並且您禁用了所有約束,截斷生病失敗,因爲單純的FK存在。你真的必須放棄它。

您可以創建一個腳本來自動執行它(截斷所有表刪除和重建FKS) 我發現了一個在這裏(謹慎使用) http://www.sqlservercentral.com/scripts/Development/62892/

此外,如果你只是想創建一個「一刀切」 DB你可以導出腳本以創建所有對象,只需填充少數(域?)表即可。