想通了,我会分享我最终想出的东西。该脚本创建一个游标,以遍历数据库的INFORMATION_SCHEMA中的表。它对表进行3次传递,分别是外键,然后是主键,最后是表本身。它基于Raj
More的想法,并考虑了devio的评论。
-- Helper ProcedureCREATE PROC #DropConstraints @tableSchema nvarchar(max), @tableName nvarchar(max), @constraintType nvarchar(20)ASBEGIN DECLARE @cName nvarchar(max); DECLARE constraint_cursor CURSOR FOR SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_ConSTRAINTS WHERe CONSTRAINT_TYPE = @constraintType AND TABLE_NAME = @tableName AND TABLE_SCHEMA = @tableSchema OPEN constraint_cursor FETCH NEXT FROM constraint_cursor INTO @cName WHILE @@FETCH_STATUS = 0 BEGIN EXEC ('ALTER TABLE ' + @tableSchema + '.' + @tableName + ' DROp ConSTRAINT ' + @cName); FETCH NEXT FROM constraint_cursor INTO @cName END CLOSE constraint_cursor DEALLOCATE constraint_cursorENDGO-- DROp DATAbase TABLESBEGIN TRANSACTION DECLARE @tableSchema varchar(max), @tableName varchar(max); -- Setup Cursor for looping DECLARE table_cursor SCROLL CURSOR FOR SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES OPEN table_cursor -- Drop Foreign Keys FETCH NEXT FROM table_cursor INTO @tableSchema, @tableName WHILE @@FETCH_STATUS = 0 BEGIN EXEC #DropConstraints @tableSchema, @tableName, 'FOREIGN KEY'; FETCH NEXT FROM table_cursor INTO @tableSchema, @tableName END -- Drop Primary Keys FETCH FIRST FROM table_cursor INTO @tableSchema, @tableName WHILE @@FETCH_STATUS = 0 BEGIN EXEC #DropConstraints @tableSchema, @tableName, 'PRIMARY KEY'; FETCH NEXT FROM table_cursor INTO @tableSchema, @tableName END -- Drop Tables FETCH FIRST FROM table_cursor INTO @tableSchema, @tableName WHILE @@FETCH_STATUS = 0 BEGIN EXEC ('DROp TABLE ' + @tableSchema + '.' + @tableName); FETCH NEXT FROM table_cursor INTO @tableSchema, @tableName END -- Cleanup CLOSE table_cursor DEALLOCATE table_cursorCOMMIT TRANSACTIONGO
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)