Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server:如何删除模式及其所有对象?_Sql Server - Fatal编程技术网

Sql server SQL Server:如何删除模式及其所有对象?

Sql server SQL Server:如何删除模式及其所有对象?,sql-server,Sql Server,SQL Server:如何删除架构并将删除操作级联到其所有对象?e、 g database1 schema1 schema2 table1 table2 删除架构: drop schema database1.schema2 无法删除架构。在Oracle中: drop user schema2 cascade 如何在SQL Server中实现这一点?您可以为特定架构下的所有表创建DROP TABLE动态SQL查询,然后在删除架构之前先执行该查询。下面是你

SQL Server:如何删除架构并将删除操作级联到其所有对象?e、 g

database1
   schema1
   schema2
      table1
      table2
删除架构:

drop schema database1.schema2
无法删除架构。在Oracle中:

drop user schema2 cascade
如何在SQL Server中实现这一点?

您可以为特定架构下的所有表创建DROP TABLE动态SQL查询,然后在删除架构之前先执行该查询。下面是你需要做的事情。请注意,在删除表之前,还需要删除表的主键和外键

DECLARE @SQL        NVARCHAR(2000)
DECLARE @SchemaName NVARCHAR(100)
DECLARE @Counter    INT
DECLARE @TotalRows  INT

SET @SchemaName = 'DBO'
SET @Counter = 1

SET @SQL='
SELECT ''DROP TABLE '' + S.[Name] + ''.'' + O.[Name] AS DropTableStatement
FROM SYS.OBJECTS AS O INNER JOIN SYS.SCHEMAS AS S ON O.[schema_id] = S.[schema_id]
WHERE O.TYPE = ''U'' AND S.[Name] = ''' + @SchemaName + ''''

DROP TABLE IF EXISTS #DropStatements

CREATE TABLE #DropStatements
(
    ID                  INT IDENTITY (1, 1),
    DropTableStatement  VARCHAR(2000)
)

INSERT INTO #DropStatements
EXEC (@SQL)

SELECT @TotalRows = COUNT(ID) FROM #DropStatements

WHILE @Counter <= @TotalRows
BEGIN
    SELECT @SQL = DropTableStatement FROM #DropStatements WHERE ID = @Counter

    PRINT @SQL
    EXEC (@SQL)

    SET @Counter = @Counter + 1
END

SET @SQL = N'DROP SCHEMA ' + @SchemaName
PRINT @SQL
EXEC @SQL
您可以为特定模式下的所有表创建DROP TABLE动态SQL查询,然后在删除模式之前先执行该查询。下面是你需要做的事情。请注意,在删除表之前,还需要删除表的主键和外键

DECLARE @SQL        NVARCHAR(2000)
DECLARE @SchemaName NVARCHAR(100)
DECLARE @Counter    INT
DECLARE @TotalRows  INT

SET @SchemaName = 'DBO'
SET @Counter = 1

SET @SQL='
SELECT ''DROP TABLE '' + S.[Name] + ''.'' + O.[Name] AS DropTableStatement
FROM SYS.OBJECTS AS O INNER JOIN SYS.SCHEMAS AS S ON O.[schema_id] = S.[schema_id]
WHERE O.TYPE = ''U'' AND S.[Name] = ''' + @SchemaName + ''''

DROP TABLE IF EXISTS #DropStatements

CREATE TABLE #DropStatements
(
    ID                  INT IDENTITY (1, 1),
    DropTableStatement  VARCHAR(2000)
)

INSERT INTO #DropStatements
EXEC (@SQL)

SELECT @TotalRows = COUNT(ID) FROM #DropStatements

WHILE @Counter <= @TotalRows
BEGIN
    SELECT @SQL = DropTableStatement FROM #DropStatements WHERE ID = @Counter

    PRINT @SQL
    EXEC (@SQL)

    SET @Counter = @Counter + 1
END

SET @SQL = N'DROP SCHEMA ' + @SchemaName
PRINT @SQL
EXEC @SQL

我不认为我们可以删除模式而不删除引用它的表。我们需要先删除表,包括它的主键和外键,然后才能删除模式。您可以使用动态SQL为模式中的所有表创建删除表脚本。我认为如果不删除引用的表,就无法删除模式。我们需要先删除表,包括它的主键和外键,然后才能删除模式。您可以使用动态SQL为架构中的所有表创建删除表脚本。@Sunnyday,如果您觉得这有帮助,请告诉我。这对我帮助很大,谢谢!!!我不得不做一些更改,但最终我有了一个存储过程,您可以将架构名称传递给它,然后它将删除所有表。@Sunnyday,如果您觉得这有帮助,请告诉我。这对我帮助很大,谢谢!!!我不得不做一些更改,但最终我有了一个存储过程,您可以将模式名称传递给它,然后它将删除所有表。