2012-07-27 19 views
22

Utilizzando questa istruzione in SQL Server:Eliminare tutte le viste da SQL Server

EXEC sp_msforeachtable 'DROP TABLE ?' 

So che è possibile eliminare tutte le tabelle in una sola volta.

Esiste una dichiarazione simile per le visualizzazioni? Ho provato questo sperando di essere fortunato: EXEC sp_msforeachview 'DROP VIEW?' ma non funziona!

+0

avere la vostra provato 'DROP VIEW?' EXEC sp_msforeachTABLE ? –

risposta

50

Qui si ha, nessun cursore necessario:

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

Se si dispone di una vista in un altro schema (diverso da dbo), questo script si interromperà. – MikeTeeVee

+0

Anche se si hanno caratteri speciali nei propri nomi, si romperà anche. – MikeTeeVee

+1

L'aggiunta di alcune parentesi quadre ti aiuterà a gestire spazi, caratteri speciali, ecc. SELECT @ sql = @ sql + 'DROP VIEW [' + name + '];' DA sys.views; – user1316401

2

Prova questo script

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

Ma per quanto riguarda lo schema?
Lo script di seguito vi aiuterà se il punto di vista fanno parte dello schema

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

Tutte le risposte non tengono conto di vincoli tra punti di vista. Questo script tenerne conto:

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 

Questo loop a tutte le viste e seleziona il TOP 1 visita che non è presente nei riferimenti systable.

4

Volevo uno script per eliminare le viste associate allo schema nell'ordine di dipendenza corretto e volevo che fosse eseguito su sql azzurro dove sys.dm_sql_referencing_entities non è disponibile. Volevo anche essere in grado di visualizzare lo sql in esecuzione prima di eseguirlo effettivamente, cosa che non è possibile fare con lo script nella risposta di @RicNet. Così ho scritto questa query ricorsiva che utilizzano le altre risposte qui come una fondazione

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

Dal momento che nessuno degli script ho provato dalle risposte funzionava correttamente, nel caso di più schemi sto tra cui una di lavoro.

--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

Problemi correlati