una - Eliminar todas las vistas de Sql Server
sintaxis para eliminar una vista en mysql (8)
Aquí tienes, no necesitas cursor:
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);
Al utilizar esta declaración en SQL Server:
EXEC sp_msforeachtable ''DROP TABLE ?''
Sé que es posible eliminar todas las tablas a la vez.
¿Hay una declaración similar para las vistas? Intenté esto con la esperanza de tener suerte: EXEC sp_msforeachview ''DROP VIEW?'' ¡Pero no funciona!
Dado que ninguno de los scripts que probé a partir de las respuestas funcionó correctamente en el caso de varios esquemas, estoy incluyendo uno operativo.
--DBNAME, PUT YOU OWN ONE use SIPE_ISU
DECLARAR @viewName varchar (500) DECLARAR CURSOR PARA SELECCIONAR sk.name + ''.'' + So.name FROM sys.objects tan internal join sys.schemas sk en sk.schema_id = so.schema_id DONDE type = ''v'' OPEN OP cur FETCH NEXT DESDE cur INTO @viewName WHILE @@ fetch_status = 0 BEGIN EXEC (''DROP VIEW'' + @viewName) FETCH NEXT DESDE cur INTO @viewName FIN CERRAR CUR DEALLOCATE cur
Pero ¿qué pasa con el esquema?
El siguiente script le ayudará si las vistas son parte del esquema
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)
Prueba este guion
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
Quería que una secuencia de comandos eliminara las vistas enlazadas del esquema en el orden de dependencia correcto, y quería que se ejecutara en SQL sys.dm_sql_referencing_entities
donde sys.dm_sql_referencing_entities
no está disponible. También quería poder ver el sql que se está ejecutando antes de ejecutarlo, lo que no se puede hacer con el script en la respuesta de @RicNet. Así que escribí esta consulta recursiva que usa las otras respuestas aquí como base
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)
Todas las respuestas no tienen en cuenta las restricciones entre vistas. Este script tendrá esto en cuenta:
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
Esto pasa a todas las vistas y selecciona la vista TOP 1 que no está presente en el sistema de referencias.
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)