使用通配符从 sys.views 中删除

BoJ*_*man 1 sql-server t-sql sql-server-2008-r2

我可以在我的服务器上运行删除语句,但是每当我where向删除语句添加子句时,它都会引发以下错误:

消息 10054,级别 20,状态 0,第 0 行
向服务器发送请求时发生传输级错误。(提供程序:TCP 提供程序,错误:0 - 现有连接被远程主机强制关闭。)

此语法引发错误 ->

DELETE 
FROM sys.views
WHERE sys.views.name LIKE '%DoNotNeed_%'
Run Code Online (Sandbox Code Playgroud)

为了删除所有以“不需要”开头的视图,我是否设置不正确?

Aar*_*and 5

另一种动态 SQL 方法(还包括架构,通常很重要!):

DECLARE @sql nvarchar(max) = N'';

SELECT @sql += N',' + QUOTENAME(s.name) + N'.' + QUOTENAME(v.name)
FROM sys.schemas AS s
INNER JOIN sys.views AS v
ON s.[schema_id] = v.[schema_id]
WHERE v.[name] LIKE N'%DoNotNeed[_]%';

SET @sql = N'DROP VIEW ' + STUFF(@sql, 1, 1, N'') + N';';

PRINT @sql;
-- EXEC sys.sp_executesql @sql;
Run Code Online (Sandbox Code Playgroud)

这将生成如下命令,这是合法的(您不需要DROP VIEW为每个视图都使用命令):

DROP VIEW [dbo].[view1], [dbo].[view2], [dbo].[view3], ...;
Run Code Online (Sandbox Code Playgroud)

当您认为它是正确的时(请注意,PRINT如果超过 8k ,可能不会输出整个命令),请取消注释EXEC.

请注意,无论您使用什么解决方案,删除某些视图都可能会遇到困难(例如,它们可能被使用的对象引用WITH SCHEMABINDING)。在这种情况下,您可能想使用更复杂的东西:

DECLARE @sql nvarchar(max) = N'';

SELECT @sql += N'
BEGIN TRY
  DROP VIEW ' + name + N';
  PRINT N''   Dropped ' + name + N'!'';
END TRY
BEGIN CATCH
  PRINT N''Could not drop ' + name + N'!'';
  PRINT ERROR_MESSAGE();
END CATCH'
FROM 
(
  SELECT name = QUOTENAME(s.name) + N'.' + QUOTENAME(v.name)
   FROM sys.schemas AS s
   INNER JOIN sys.views AS v
   ON s.[schema_id] = v.[schema_id]
   WHERE v.[name] LIKE N'%DoNotNeed[_]%'
) AS x;

PRINT @sql;
-- EXEC sys.sp_executesql @sql;
Run Code Online (Sandbox Code Playgroud)

'如果名称中包含视图,则此解决方案的某些部分可能会很复杂。不要那样做。