删除视图(如果存在)

时间:2016-03-21 14:29:48

标签: sql sql-server view create-view

我有脚本,我想首先删除视图,然后创建它。 我知道如何放桌子:

IF EXISTS (SELECT * FROM sys.tables WHERE name = 'table1' AND type = 'U') DROP TABLE table1;

所以我对观点做了同样的事情:

IF EXISTS (SELECT * FROM sys.views WHERE name = 'view1' AND type = 'U') DROP VIEW view1;
create view1 as(......)

然后我收到了错误:

  

'创建视图'必须是查询批处理中的第一个语句。

4 个答案:

答案 0 :(得分:71)

你的存在语法是错误的,你应该用下面的

分隔DDL
if exists(select 1 from sys.views where name='tst' and type='v')
drop view tst;
go

create view tst
as
select * from test

您还可以使用object_id检查存在测试,如下所示

if object_id('tst','v') is not null
drop view tst;
go

create view tst
as
select * from test

在SQL 2016中,您可以使用以下语法删除

Drop view  if exists dbo.tst

从SQL2016 CU1,你可以在下面

create or alter view vwTest
as
 select 1 as col;
go

答案 1 :(得分:1)

为了满足架构,请在SQL 2014中使用此格式

if exists(select 1 from sys.views V inner join sys.[schemas] S on  v.schema_id = s.schema_id where s.name='dbo' and v.name = 'someviewname' and v.type = 'v')
  drop view [dbo].[someviewname];
go

然后把它扔到那里,做存储过程,因为我也需要它:

if exists(select 1
          from sys.procedures p
          inner join sys.[schemas] S on p.schema_id = s.schema_id
          where
              s.name='dbo' and p.name = 'someprocname'
          and p.type in ('p', 'pc')
  drop procedure [dbo].[someprocname];
go

答案 2 :(得分:1)

关于错误

  

'CREATE VIEW' must be the first statement in a query batch.

Microsoft SQL Server有一个奇怪的要求,即CREATE VIEW是批处理中的 only 语句。其他一些语句也是如此,例如CREATE FUNCTIONCREATE TABLE not 是true,所以请弄清楚……

解决方案是将脚本分批发送到服务器。一种方法是选择一个语句并执行它。显然这很不方便。

更方便的解决方案是让客户端以孤立的小批量发送脚本。

GO关键字并不是严格意义上的SQL命令,这就是为什么您不能像真实的SQL命令那样以分号结尾的原因。而是向客户发出指令,要求它在此时中断脚本并将该部分作为批处理发送。

结果,您最终写了类似这样的东西:

DROP VIEW IF EXISTS … ;
GO
CREATE VIEW … AS … ;
GO

我遇到的其他所有数据库服务器(PostgreSQL,MySQL,Oracle,SQLite)都没有这个怪癖,因此要求似乎仅限Microsoft。

答案 3 :(得分:1)

DROP VIEW if exists {ViewName}
Go
CREATE View {ViewName} AS 
SELECT * from {TableName}  
Go