所有视图在SQL Server中使用此语句:删除从SQL Server
EXEC sp_msforeachtable 'DROP TABLE ?'
我知道这是可以一次删除所有表。
是否有类似的声明意见?我试过这个希望是幸运的: EXEC sp_msforeachview'DROP VIEW?'但它不起作用!
所有视图在SQL Server中使用此语句:删除从SQL Server
EXEC sp_msforeachtable 'DROP TABLE ?'
我知道这是可以一次删除所有表。
是否有类似的声明意见?我试过这个希望是幸运的: EXEC sp_msforeachview'DROP VIEW?'但它不起作用!
在这里,你有没有需要光标:
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);
如果您在另一个架构(dbo除外)中有一个视图,则此脚本将中断。 – MikeTeeVee 2013-03-14 07:45:44
另外,如果你的名字中有特殊字符,它也会中断。 – MikeTeeVee 2013-03-14 07:52:22
添加一些方括号将有助于处理空格,特殊字符等。 SELECT @ sql = @ sql +'DROP VIEW ['+ name +'];' FROM sys.views; – user1316401 2013-04-03 02:21:01
试试这个脚本
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
declare @SQL nvarchar(max)
set @SQL =
(
select 'drop view '+name+'; '
from sys.views
for xml path('')
)
exec (@SQL)
但怎么样的模式?
下面的脚本将帮助你,如果看法架构
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)
的一部分,所有的答案不占视图之间的约束。该脚本将考虑到这一点:
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
这循环到所有视图,并选择引用systable中不存在的TOP 1视图。
我想要一个脚本以正确的依赖顺序删除模式绑定视图,并且我希望它能在sql azure上运行,其中sys.dm_sql_referencing_entities
不可用。我也希望能够在实际运行之前查看正在运行的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)
由于没有从我的答案试图脚本的一个多模式我包括一个正在运行的情况下工作正常这个递归查询。
--DBNAME, PUT YOU OWN ONE use SIPE_ISU
DECLARE @viewName varchar(500) DECLARE cur CURSOR FOR SELECT sk.name + '.'+so.name FROM sys.objects so inner join sys.schemas sk on sk.schema_id = so.schema_id 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
已尝试过EXEC sp_msforeachTABLE'DROP VIEW?' ? – 2012-07-27 14:19:04