我需要在我们的SQL Server 2008数据库中删除所有默认约束。有没有人写过一个T- SQL脚本来做到这一点?注意,我只需要删除默认约束,而不是其他任何类型的约束。
我发布代码是因为我讨厌让您注册阅读答案的网站。这段代码不是我的…首先备份您的数据库。
来自http://www.sqlservercentral.com/Forums/Topic401454-446-1.aspx
USE MyDB DECLARE @sSql NVARCHAR(4000) SET @sSql = '' DECLARE @sTypeDesc sysname SET @sTypeDesc = '' DECLARE @sTableName sysname SET @sTableName = '' DECLARE @sConstraintName sysname SET @sConstraintName = '' DECLARE cur CURSOR DYNAMIC FOR SELECT name, type_desc, OBJECT_NAME(parent_object_id) FROM sys.objects WHERE is_ms_shipped = 0 AND type_desc LIKE '%_CONSTRAINT' ORDER BY type_desc, name WHILE 1 = 1 BEGIN OPEN cur FETCH FIRST FROM cur INTO @sConstraintName, @sTypeDesc, @sTableName IF @@FETCH_STATUS != 0 BEGIN CLOSE cur BREAK END WHILE @@FETCH_STATUS = 0 BEGIN BEGIN TRY SET @sSql = 'ALTER TABLE ' + QUOTENAME(@sTableName) + ' DROP CONSTRAINT ' + QUOTENAME(@sConstraintName) RAISERROR('%s', 10, 1, @sSql) WITH NOWAIT EXEC sp_executesql @sSql END TRY BEGIN CATCH DECLARE @ENumber INT SET @ENumber = ISNULL(ERROR_NUMBER(), -1) DECLARE @ESeverity INT SET @ESeverity = ISNULL(ERROR_SEVERITY(), -1) DECLARE @EState INT SET @EState = ISNULL(ERROR_STATE(), 0) IF @EState = 0 SET @EState = 42 DECLARE @EProcedure NVARCHAR(126) SET @EProcedure = ISNULL(ERROR_PROCEDURE(), N'{N/A}') DECLARE @ELine INT SET @ELine = ISNULL(ERROR_LINE(), -1) DECLARE @EMessageRecv NVARCHAR(2048) SET @EMessageRecv = ISNULL(ERROR_MESSAGE(), N'') DECLARE @EMessageSent NVARCHAR(440) SET @EMessageSent = N'' IF ERROR_PROCEDURE() IS NOT NULL SET @EMessageSent = N'Error %d, Level %d, State %d, Procedure %s, Line %d, Message: ' SET @EMessageSent = @EMessageSent + ERROR_MESSAGE() RAISERROR(@EMessageSent, 10 /* @ESeverity */ , @EState, @ENumber, @ESeverity, @EState, @EProcedure, @ELine) WITH LOG END CATCH FETCH NEXT FROM cur INTO @sConstraintName, @sTypeDesc, @sTableName END CLOSE cur END DEALLOCATE cur GO