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)
avere la vostra provato 'DROP VIEW?' EXEC sp_msforeachTABLE ? –