Supprimer toutes les vues du serveur Sql

en utilisant cette instruction dans SQL Server:

EXEC sp_msforeachtable 'DROP TABLE ?'

je sais qu'il est possible de supprimer toutes les tables à la fois.

Est-il une déclaration similaire pour les vues? J'ai essayé cette espérer avoir de la chance: EXEC sp_msforeachview ' DROP VIEW ?"mais il ne fonctionne pas!

24
demandé sur Arulkumar 2012-07-27 18:11:42
la source

8 ответов

ici vous avez, aucun curseur nécessaire:

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);
55
répondu Yaroslav 2014-11-07 12:21:45
la source
declare @SQL nvarchar(max)

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

exec (@SQL)
6
répondu Mikael Eriksson 2012-07-27 18:17:06
la source

toutes les réponses ne tiennent pas compte des contraintes entre les vues. Ce script va prendre cela en compte:

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

cette boucle à toutes les vues et sélectionne la vue TOP 1 qui n'est pas présente dans les références systable.

4
répondu Ric .Net 2014-11-07 12:17:45
la source

je voulais qu'un script laisse tomber les vues liées au schéma dans l'ordre de dépendance correct, et je voulais qu'il tourne sur sql azure où sys.dm_sql_referencing_entities n'est pas disponible. Je voulais aussi être capable de voir le sql en cours d'exécution avant que je ne l'exécute - ce que vous ne pouvez pas faire avec le script dans la réponse de @RicNet. J'ai donc écrit cette requête récursive qui utilisent les autres réponses ici comme une fondation

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)
4
répondu Colin 2014-12-11 17:48:04
la source

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

Voir ici pour plus d'info

2
répondu Prince Jea 2012-07-27 18:15:23
la source

Mais quel schéma?

Le script ci-dessous vous aidera si les vues font partie de 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)
2
répondu Appyks 2012-11-20 10:55:33
la source

comme aucun des scripts que j'ai essayé à partir des réponses n'a fonctionné correctement dans le cas de plusieurs schémas, j'en Inclus un qui fonctionne.

--DBNAME, PUT YOU OWN ONE use SIPE_ISU

DECLARE @viewName varchar (500) DECLARE cur curseur pour SELECT sk.nom +'.' +alors?nom de sys.les objets ainsi intérieurs rejoignent sys.les schémas sk sk.schema_id = donc.schema_id où type = "v" OPEN cur FETCH NEXT FROM cur INTO @viewName Alors que @@fetch_status = 0 COMMENCER EXEC ('DROP VIEW' + @viewName) FETCH NEXT FROM cur INTO @viewName FIN FERMER cur DEALLOCATE cur

1
répondu P. Lion 2018-01-18 18:57:42
la source
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);
-1
répondu user2122924 2018-05-02 20:42:08
la source

Autres questions sur