2010-10-08 66 views
2

我正在寫小型應用程序(在C#中),它可以幫助我截斷SQL Server 2005/08中的表。爲了截斷表,我想我需要做的是:SQL Server截斷表 - 刪除並重新創建FK約束腳本

  • 下降,由表中的所有FK約束,
  • 截斷表,
  • 重建所有以前刪除的約束。

有人可以幫我創建這樣一個腳本,或指出我在哪裏可以找到一些線索嗎?

問候

+0

相關表中的數據如何?你可以孤兒嗎? – 2010-10-08 16:12:03

+0

這不是問題,我會照顧的。 – jwaliszko 2010-10-08 16:16:15

+0

您是否有權訪問Management Studio?或者你將不得不編寫自己的腳本? – 2010-10-08 16:19:44

回答

4

嗯,你可以從你的應用程序做到這一點:

  • 運行SQL命令的現有數據庫上找到所有的外鍵約束
  • 從外鍵約束列表,創建兩個腳本
    • 一個刪除所有現有的外鍵約束(在截斷表之前)
    • 第二個在截斷表之後重新創建外鍵約束

您可以通過檢查系統目錄視圖來執行此操作。

此查詢會給你的所有的外鍵約束列表:

select 
    fk.name, 
    object_name(fk.parent_object_id) 'Parent table', 
    c1.name 'Parent column', 
    object_name(fk.referenced_object_id) 'Referenced table', 
    c2.name 'Referenced column' 
from 
    sys.foreign_keys fk 
inner join 
    sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id 
inner join 
    sys.columns c1 ON fkc.parent_column_id = c1.column_id and c1.object_id = fkc.parent_object_id 
inner join 
    sys.columns c2 ON fkc.referenced_column_id = c2.column_id and c2.object_id = fkc.referenced_object_id 

通過組合這些元素,你可以創建DROP CONSTRAINT命令列表中的桌子上截斷之前運行:

select 
    'ALTER TABLE dbo.' + object_name(fk.parent_object_id) + 
    ' DROP CONSTRAINT ' + fk.name 
from 
    sys.foreign_keys fk 

並且您還可以創建要在截斷後運行的ALTER TABLE腳本以恢復外鍵關係。

select 
    'ALTER TABLE dbo.' + object_name(fk.parent_object_id) + 
    ' ADD CONSTRAINT ' + fk.name + 
    ' FOREIGN KEY(' + c1.name + ') REFERENCES dbo.' + 
    object_name(fk.referenced_object_id) + '(' + c2.name + ')' 
from 
    sys.foreign_keys fk 
inner join 
    sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id 
inner join 
    sys.columns c1 ON fkc.parent_column_id = c1.column_id and c1.object_id = fkc.parent_object_id 
inner join 
    sys.columns c2 ON fkc.referenced_column_id = c2.column_id and c2.object_id = fkc.referenced_object_id 

對於這兩個疑問,這是一個過程分爲兩個步驟:

  • 先執行,我顯示了使用C#和ADO.NET對數據庫
  • 這將產生一個輸出查詢其是T-SQL命令列表(刪除或重新創建FK關係)
  • 取出輸出並在第二步中,從C#/ ADO.NET應用程序執行該輸出作爲T-SQL命令批處理。

限制:現在,該腳本假設和前提是你有單列外鍵的作用;如果你沒有這些,你可能需要稍微調整腳本。

+0

完美,它可以幫助我很多,謝謝。保重。 – jwaliszko 2010-10-08 20:59:23

0

在企業管理器:

  1. 選擇表,
  2. 右鍵單擊表格,選擇所有任務 - >生成SQL腳本,
  3. 取消選中生成刪除生成創建,
  4. 點擊「選項」選項卡,
  5. 勾選所有之下表腳本選項
  6. 單擊後退到常規選項卡的項目,
  7. 單擊預覽,
  8. 複製內容到記事本,
  9. 你現在有你的所有用於重新創建索引/鍵/約束的腳本。

只要一點這個塊腳本的按摩,你可以讓你的drop constraintdrop index語句。最後刪除任何聚集索引,否則隨着時間的推移,您將重建其他索引。

執行你的滴,截斷表,然後執行你腳本編寫的創建。

此外:在完成此操作後立即執行數據庫備份,因爲任何truncate table語句都會將事務日誌置於不確定狀態,因爲truncate table語句不會記錄。

+0

感謝您的幫助,但是我想在沒有管理工作室的情況下使用獨立的sql腳本(無論是否支持c#)來執行此操作。 – jwaliszko 2010-10-08 17:05:19