SQL Server 2008删除特殊架构下的所有表

Arb*_*æde 54 sql sql-server

您好我想知道是否可以删除数据库中的所有表,这些表是在自定义模式下创建的,例如DBO1 ...带有一个sql查询或特殊脚本.

谢谢

Ada*_*Dev 94

这将为您生成所有DROP TABLE语句并将SQL语句PRINT输出.然后,您可以在复制和执行之前验证它的预期.只要确保你100%确定...也许先备用:)

DECLARE @SqlStatement NVARCHAR(MAX)
SELECT @SqlStatement = 
    COALESCE(@SqlStatement, N'') + N'DROP TABLE [DBO1].' + QUOTENAME(TABLE_NAME) + N';' + CHAR(13)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DBO1' and TABLE_TYPE = 'BASE TABLE'

PRINT @SqlStatement
Run Code Online (Sandbox Code Playgroud)

  • 如果他们真的**想要一次性完成,他们可以在最后执行EXEC(或exec sp_executesql)@SqlStatement. (7认同)
  • @AdaTheDev对我来说这生成了一个任意顺序的drop语句列表.例如,我不能把孩子放在孩子面前.如果您有外键约束,则脚本不会删除表.这就是我的意思 (3认同)
  • 尽管有外键约束,您可以通过多次执行此脚本来删除所有表。 (2认同)

小智 28

我知道一些旧的线程,但我正在寻找这样的东西,并发现原始答案非常有用.也就是说,该脚本还将尝试删除该架构中可能存在的视图并给出错误消息,因为您最终尝试通过发出DROP TABLE语句来删除视图.

我最后写这篇文章是因为我需要删除给定模式中的所有表,视图,过程和函数.也许不是最优雅的方式来实现这一点,但它对我有用,我想我会分享.

DECLARE @Sql VARCHAR(MAX)
      , @Schema varchar(20)

SET @Schema = 'Integration' --put your schema name between these quotes

--tables
SELECT @Sql = COALESCE(@Sql,'') + 'DROP TABLE %SCHEMA%.' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = @Schema
    AND TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_NAME


--views
SELECT @Sql = COALESCE(@Sql,'') + 'DROP VIEW %SCHEMA%.' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = @Schema
    AND TABLE_TYPE = 'VIEW'
ORDER BY TABLE_NAME

--Procedures
SELECT @Sql = COALESCE(@Sql,'') + 'DROP PROCEDURE %SCHEMA%.' + QUOTENAME(ROUTINE_NAME) + ';' + CHAR(13)
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = @Schema
    AND ROUTINE_TYPE = 'PROCEDURE'
ORDER BY ROUTINE_NAME

--Functions
SELECT @Sql = COALESCE(@Sql,'') + 'DROP FUNCTION %SCHEMA%.' + QUOTENAME(ROUTINE_NAME) + ';' + CHAR(13)
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = @Schema
    AND ROUTINE_TYPE = 'FUNCTION'
ORDER BY ROUTINE_NAME


SELECT @Sql = COALESCE(REPLACE(@Sql,'%SCHEMA%',@Schema), '')

PRINT @Sql
Run Code Online (Sandbox Code Playgroud)


rai*_*r33 14

基于@Kevo的回答,我在删除表之前添加了以下内容以删除所有外键约束.我只在SQL2008 R2上测试过

select @Sql = COALESCE(@Sql,'') + 'ALTER TABLE %SCHEMA%.' + t.name + ' drop constraint ' + 
OBJECT_NAME(d.constraint_object_id)  + ';' + CHAR(13)
from sys.tables t 
    join sys.foreign_key_columns d on d.parent_object_id = t.object_id 
    inner join sys.schemas s on t.schema_id = s.schema_id
where s.name = @Schema
ORDER BY t.name;
Run Code Online (Sandbox Code Playgroud)


小智 13

在其他答案的基础上,这是一个存储过程spDropSchema,它删除模式中的所有对象和模式本身.

请注意,该过程也尝试删除序列对象,因此它只适用于SQL Server 2012及更高版本.

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'spDropSchema')
    BEGIN
        DROP  PROCEDURE  spDropSchema
    END
GO

CREATE PROCEDURE spDropSchema(@Schema nvarchar(200))
AS

DECLARE @Sql NVARCHAR(MAX) = '';

--constraints
SELECT @Sql = @Sql + 'ALTER TABLE '+ QUOTENAME(@Schema) + '.' + QUOTENAME(t.name) + ' DROP CONSTRAINT ' + QUOTENAME(f.name)  + ';' + CHAR(13)
FROM sys.tables t 
    inner join sys.foreign_keys f on f.parent_object_id = t.object_id 
    inner join sys.schemas s on t.schema_id = s.schema_id
WHERE s.name = @Schema
ORDER BY t.name;

--tables
SELECT @Sql = @Sql + 'DROP TABLE '+ QUOTENAME(@Schema) +'.' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = @Schema AND TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_NAME

--views
SELECT @Sql = @Sql + 'DROP VIEW '+ QUOTENAME(@Schema) +'.' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = @Schema AND TABLE_TYPE = 'VIEW'
ORDER BY TABLE_NAME

--procedures
SELECT @Sql = @Sql + 'DROP PROCEDURE '+ QUOTENAME(@Schema) +'.' + QUOTENAME(ROUTINE_NAME) + ';' + CHAR(13)
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = @Schema AND ROUTINE_TYPE = 'PROCEDURE'
ORDER BY ROUTINE_NAME

--functions
SELECT @Sql = @Sql + 'DROP FUNCTION '+ QUOTENAME(@Schema) +'.' + QUOTENAME(ROUTINE_NAME) + ';' + CHAR(13)
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = @Schema AND ROUTINE_TYPE = 'FUNCTION'
ORDER BY ROUTINE_NAME

--sequences
SELECT @Sql = @Sql + 'DROP SEQUENCE '+ QUOTENAME(@Schema) +'.' + QUOTENAME(SEQUENCE_NAME) + ';' + CHAR(13)
FROM INFORMATION_SCHEMA.SEQUENCES
WHERE SEQUENCE_SCHEMA = @Schema
ORDER BY SEQUENCE_NAME

SELECT @Sql = @Sql + 'DROP SCHEMA '+ QUOTENAME(@Schema) + ';' + CHAR(13)

EXECUTE sp_executesql @Sql

GO
Run Code Online (Sandbox Code Playgroud)

  • 有时您也必须删除用户定义的类型.它们可以在`SELECT*FROM sys.types中找到,其中is_user_defined = 1` (2认同)

Jur*_*rgy 11

我知道这是一个旧线程,但我认为最简单的方法是使用未记录的sp_MSforeachtable存储过程:

EXEC sp_MSforeachtable
  @command1 = 'DROP TABLE ?'
, @whereand = 'AND SCHEMA_NAME(schema_id) = ''your_schema_name'' '
Run Code Online (Sandbox Code Playgroud)

可以在此处找到有关此存储过程的详细报告,但是如果链接断开,则重点如下:

sp_MSforeachtable是一个存储过程,主要用于将T-SQL命令迭代地应用于当前数据库中存在的每个表.
[...]
意识到问号(?)被用作表的替换,并且在执行期间它将被适当的表名替换.

@ command1,@ command2,@ command3
sp_MSforeachtable存储过程至少需要执行一个命令(@ command1),但它最多允许执行3个命令.请注意,它将首先执行@ command1,然后执行@ command2和@ command3,最后执行每个表.

@precommand
使用此参数提供要在@ command1之前执行的命令.设置变量环境或执行任何类型的初始化都很有用.

@postcommand
使用此参数提供在成功执行所有命令后要执行的命令.它对控制和清理过程很有用.

@replacechar
默认情况下,表由问号(?)字符表示.此参数允许您更改此字符.

@whereand
默认情况下,sp_MSforeachtable应用于数据库中的所有用户表.使用此参数筛选要使用的表.在下一节中,我将解释如何过滤表格.


小智 7

同样基于@Kevo的答案,我添加了以下while循环以解决我在TSQL Print语句中遇到的问题.消息字符串最长可达8,000个字符.如果大于8,000,则print语句将截断任何剩余字符.

DECLARE @SqlLength int
      , @SqlPosition int = 1
      , @printMaxLength int = 8000

SET @SqlLength = LEN(@Sql)

WHILE (@SqlLength) > @printMaxLength
BEGIN
    PRINT SUBSTRING(@Sql, @SqlPosition, @printMaxLength)
    SET @SqlLength = @SqlLength - @printMaxLength
    SET @SqlPosition = @SqlPosition + @printMaxLength
END
IF (@SqlLength) < @printMaxLength AND (@SqlLength) > 0
BEGIN
    PRINT SUBSTRING(@Sql, @SqlPosition, @printMaxLength)
END
Run Code Online (Sandbox Code Playgroud)