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.
Existe-t-il une déclaration similaire pour les points de vue? J'ai essayé ceci en espérant avoir de la chance: EXEC sp_msforeachview 'DROP VIEW?' mais ça ne marche pas!
Ici vous avez, pas de 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);
declare @SQL nvarchar(max)
set @SQL =
(
select 'drop view '+name+'; '
from sys.views
for xml path('')
)
exec (@SQL)
Toutes les réponses ne tiennent pas compte des contraintes entre les vues. Ce script tiendra compte de ceci:
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) =@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])
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
Cela boucle sur toutes les vues et sélectionne la vue TOP 1 qui n’est pas présente dans les références systable.
Je souhaitais qu'un script supprime les vues liées au schéma dans le bon ordre de dépendance et qu'il s'exécute sur SQL Azure où sys.dm_sql_referencing_entities
n'est pas disponible. Je voulais aussi pouvoir voir le SQL en cours d'exécution avant de le lancer - 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 utilise les autres réponses ici comme fondement
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)
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
Mais qu'en est-il du schéma?
Le script ci-dessous vous aidera si les vues font partie du schéma
DECLARE @sql VARCHAR(MAX)='';
SELECT @sql=@sql+'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)