2012-07-27 111 views
22

所有视图在SQL Server中使用此语句:删除从SQL Server

EXEC sp_msforeachtable 'DROP TABLE ?' 

我知道这是可以一次删除所有表。

是否有类似的声明意见?我试过这个希望是幸运的: EXEC sp_msforeachview'DROP VIEW?'但它不起作用!

+0

已尝试过EXEC sp_msforeachTABLE'DROP VIEW?' ? – 2012-07-27 14:19:04

回答

50

在这里,你有没有需要光标:

DECLARE @sql VARCHAR(MAX) = '' 
     , @crlf VARCHAR(2) = CHAR(13) + CHAR(10) ; 

SELECT @sql = @sql + 'DROP VIEW ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(v.name) +';' + @crlf 
FROM sys.views v 

PRINT @sql; 
EXEC(@sql); 
+0

如果您在另一个架构(dbo除外)中有一个视图,则此脚本将中断。 – MikeTeeVee 2013-03-14 07:45:44

+0

另外,如果你的名字中有特殊字符,它也会中断。 – MikeTeeVee 2013-03-14 07:52:22

+1

添加一些方括号将有助于处理空格,特殊字符等。 SELECT @ sql = @ sql +'DROP VIEW ['+ name +'];' FROM sys.views; – user1316401 2013-04-03 02:21:01

2

试试这个脚本

DECLARE @viewName varchar(500) 
DECLARE cur CURSOR 
     FOR SELECT [name] FROM sys.objects WHERE type = 'v' 
     OPEN cur 

     FETCH NEXT FROM cur INTO @viewName 
     WHILE @@fetch_status = 0 
     BEGIN 
      EXEC('DROP VIEW ' + @viewName) 
      FETCH NEXT FROM cur INTO @viewName 
     END 
     CLOSE cur 
     DEALLOCATE cur 

See here for more info

6
declare @SQL nvarchar(max) 

set @SQL = 
    (
    select 'drop view '+name+'; ' 
    from sys.views 
    for xml path('') 
) 

exec (@SQL) 
2

但怎么样的模式?
下面的脚本将帮助你,如果看法架构

DECLARE @sql VARCHAR(MAX)=''; 
SELECT @[email protected]+'DROP VIEW '+name +';' FROM 
(
SELECT Name=[s].name + '.' + [v].name FROM sys.views [v] 
LEFT OUTER JOIN sys.schemas [s] 
ON 
(
    [v].[schema_id]=[s].[schema_id] 
) 
) 
X 
EXEC(@sql) 
4

的一部分,所有的答案不占视图之间的约束。该脚本将考虑到这一点:

SET @schemeName = 'dbo' 

SELECT @name = 
(SELECT TOP 1 o.[name] 
FROM sysobjects o 
inner join sys.views v ON o.id = v.object_id 
WHERE SCHEMA_NAME(v.schema_id) [email protected] AND o.[type] = 'V' AND o.category = 0 AND o.[name] NOT IN 
(
    SELECT referenced_entity_name 
    FROM sys.sql_expression_dependencies AS sed 
    INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id 
    WHERE referenced_schema_name = @schemeName 
) 
ORDER BY [name]) 

WHILE @name IS NOT NULL 
BEGIN 
    SELECT @SQL = 'DROP VIEW [' + @schemeName + '].[' + RTRIM(@name) +']' 
    EXEC (@SQL) 
    PRINT 'Dropped View: ' + @name 
SELECT @name = 
(SELECT TOP 1 o.[name] 
FROM sysobjects o 
inner join sys.views v ON o.id = v.object_id 
WHERE SCHEMA_NAME(v.schema_id) = @schemeName AND o.[type] = 'V' AND o.category = 0 AND o.[name] NOT IN 
(
    SELECT referenced_entity_name 
    FROM sys.sql_expression_dependencies AS sed 
    INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id 
    WHERE referenced_schema_name = @schemeName 
) 
ORDER BY [name]) 
END 
GO 

这循环到所有视图,并选择引用systable中不存在的TOP 1视图。

4

我想要一个脚本以正确的依赖顺序删除模式绑定视图,并且我希望它能在sql azure上运行,其中sys.dm_sql_referencing_entities不可用。我也希望能够在实际运行之前查看正在运行的sql,而@RicNet在答复中无法处理脚本。所以我写了,这里使用其他的答案为基础

DECLARE @sql VARCHAR(MAX) = '' 
DECLARE @crlf VARCHAR(2) = CHAR(13) + CHAR(10); 

;WITH allviews as 
(--just combining schema and name 
SELECT 
    object_id, 
    '[' + SCHEMA_NAME(schema_id) + '].[' + name + ']' AS viewname 
FROM sys.views 
), 
dependents AS 
( 
SELECT 
    referencing.viewname dependentname, 
    referenced.viewname dependenton 
FROM sys.sql_expression_dependencies r 
    INNER JOIN allviews referencing 
     ON referencing.object_id = r.referencing_id 
    INNER JOIN allviews referenced 
     ON referenced.object_id = r.referenced_id 
) 
, 
nodependents 
AS 
( 
SELECT 
    viewname name 
FROM allviews v 
    LEFT JOIN dependents d 
     ON d.dependentname = viewname 
WHERE d.dependentname IS NULL 
) 
,hierarchy AS 
(--the hierarchy recurses the dependencies 
SELECT 
    d.dependenton, 
    d.dependentname, 
    1 tier 
FROM dependents d UNION ALL SELECT 
    d.dependenton, 
    d.dependentname, 
    h.tier + 1 
FROM dependents d 
    INNER JOIN hierarchy h 
     ON h.dependenton = d.dependentname 
--best thing I could think to stop the recursion was to 
--stop when we reached an item with no dependents  
WHERE h.dependenton NOT IN (SELECT 
    name 
FROM nodependents) 
    ), 
combined as 
(--need to add item with no dependents back in 
SELECT 
    0 tier, 
    name 
FROM nodependents UNION SELECT 
    tier, 
    dependentname 
FROM hierarchy 
) 
SELECT 
    @sql = @sql + 'DROP VIEW ' + name + ';' + @crlf 
FROM combined 
GROUP BY name --need to group because of multiple dependency paths 
ORDER BY MAX(tier) desc 

PRINT @sql; 

--commented out until I'm confident I want to run it 
--EXEC(@sql) 
1

由于没有从我的答案试图脚本的一个多模式我包括一个正在运行的情况下工作正常这个递归查询。

--DBNAME, PUT YOU OWN ONE use SIPE_ISU

DECLARE @viewName varchar(500) DECLARE cur CURSOR FOR SELECT sk.name + '.'+so.name FROM sys.objects so inner join sys.schemas sk on sk.schema_id = so.schema_id WHERE type = 'v' OPEN cur FETCH NEXT FROM cur INTO @viewName WHILE @@fetch_status = 0 BEGIN EXEC('DROP VIEW ' + @viewName) FETCH NEXT FROM cur INTO @viewName END CLOSE cur DEALLOCATE cur