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)
为了删除所有以“不需要”开头的视图,我是否设置不正确?
另一种动态 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)
'如果名称中包含视图,则此解决方案的某些部分可能会很复杂。不要那样做。
| 归档时间: |
|
| 查看次数: |
1254 次 |
| 最近记录: |