我有大约50多个表在我的数据库中,现在我想删除除少数表之外的所有表。
现在我知道的是sys.tables
是一个列出所有表的表,所以我最初运行了这样的查询
delete from sys.tables where name like '%DynamicSurgery' (or any other condition)
我以为这可能起作用。但正如我所预料的那样,它抛出了一个错误,如下:
不允许对系统目录进行临时更新。
请告诉我有没有办法在SQL Server中删除多个?
我有大约50多个表在我的数据库中,现在我想删除除少数表之外的所有表。
现在我知道的是sys.tables
是一个列出所有表的表,所以我最初运行了这样的查询
delete from sys.tables where name like '%DynamicSurgery' (or any other condition)
我以为这可能起作用。但正如我所预料的那样,它抛出了一个错误,如下:
不允许对系统目录进行临时更新。
请告诉我有没有办法在SQL Server中删除多个?
DROP
所需表:DECLARE @ExecSQL AS NVARCHAR (MAX) = '';
SELECT @ExecSQL = @ExecSQL +
'DROP TABLE ' + QUOTENAME(S.name) + '.' + QUOTENAME(T.name) + '; '
FROM sys.tables T
JOIN sys.schemas S ON S.schema_id = T.schema_id
WHERE T.name LIKE '%DynamicSurgery'
--PRINT @ExecSQL
EXEC (@ExecSQL)
@ExecSQL
长度为(MAX)
,因为您不知道表的数量(因此也不知道SQL语句的长度)。 您应该使用2部分名称QUOTENAME(schema) + '.' + QUOTENAME(name)
,因为表可能属于不同的架构。 并且您必须按它们正确的名称引用系统表和列,包括大小写,否则在区分大小写的比较数据库上,您的示例将失败。 - Remus Rusanu EXEC sys.sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL';
EXEC sp_MSforeachtable 'IF OBJECT_ID(''?'') NOT IN (
ISNULL(OBJECT_ID(''[dbo].[Table1]''),0),
ISNULL(OBJECT_ID(''[dbo].[Table2]''),0)
)
DELETE FROM ?';
EXEC sys.sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL';