从Sql Server中删除所有视图

Sam*_*Sam 27 sql sql-server-2008 sp-msforeachtable

通过在SQL Server中使用此语句:

EXEC sp_msforeachtable 'DROP TABLE ?'
Run Code Online (Sandbox Code Playgroud)

我知道可以一次删除所有表.

是否有类似的观点陈述?我试过这个希望是幸运的:EXEC sp_msforeachview'DROP VIEW?' 但它不起作用!

Yar*_*lav 62

你有,不需要光标:

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);
Run Code Online (Sandbox Code Playgroud)


Mik*_*son 7

declare @SQL nvarchar(max)

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

exec (@SQL)
Run Code Online (Sandbox Code Playgroud)


Col*_*lin 5

sys.dm_sql_referencing_entities我想要一个脚本以正确的依赖顺序删除架构绑定视图,并且我希望它在不可用的sql azure 上运行。我还希望能够在实际运行之前查看正在运行的 sql - 您无法使用 @RicNet 答案中的脚本来执行此操作。所以我写了这个递归查询,使用这里的其他答案作为基础

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)
Run Code Online (Sandbox Code Playgroud)