Sql-Server

如何從所有表中刪除所有約束?

  • October 28, 2020

我想從 SQL Server 數據庫中的所有表中刪除所有預設約束、檢查約束、唯一約束、主鍵和外鍵。我知道如何從中獲取所有約束名稱sys.objects,但是如何填充該ALTER TABLE部分?

您可以通過加入sys.tables.object_id = sys.objects.parent_object_id這些對像類型輕鬆獲取此資訊。

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';

SELECT @sql = @sql + N'
 ALTER TABLE ' + QUOTENAME(s.name) + N'.'
 + QUOTENAME(t.name) + N' DROP CONSTRAINT '
 + QUOTENAME(c.name) + ';'
FROM sys.objects AS c
INNER JOIN sys.tables AS t
ON c.parent_object_id = t.[object_id]
INNER JOIN sys.schemas AS s 
ON t.[schema_id] = s.[schema_id]
WHERE c.[type] IN ('D','C','F','PK','UQ')
ORDER BY c.[type];

PRINT @sql;
--EXEC sys.sp_executesql @sql;

PRINT只是用於觀察,而不是用於複製和粘貼輸出(如果要執行它,這就是註釋掉的EXEC目的)-如果您有很多限制,它可能不會顯示整個腳本,因為PRINT僅限於4,000 個字元 (8kb)。在這些情況下,如果您需要驗證整個腳本,請參閱此提示以了解在執行之前驗證腳本的其他方法。例如:

SELECT CONVERT(xml, @sql);

對輸出感到滿意後,取消註釋EXEC.

引用自:https://dba.stackexchange.com/questions/90033