删除视图(如果存在)
Drop view if exists
我有一个脚本,我想先删除视图然后再创建它。
我知道如何删除 table:
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(......)
然后我得到错误:
'CREATE VIEW' must be the first statement in a query batch.
你现有的语法是错误的,你应该像下面这样将 DDL 与 go 分开
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
为了满足模式,请在 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
关于错误
'CREATE VIEW' must be the first statement in a query batch.
Microsoft SQL 服务器有一个奇怪的要求,即 CREATE VIEW
是批处理中的 only 语句。其他一些语句也是如此,例如 CREATE FUNCTION
。 不是 CREATE TABLE
的真实情况,所以去计算一下……
解决方案是将您的脚本小批量发送到服务器。一种方法是 select 一条语句并执行它。这显然很不方便。
更方便的解决方案是让客户端以独立的小批量发送脚本。
GO
关键字严格来说并不是 SQL 命令,这就是为什么你不能像真正的 SQL 命令那样以分号结尾的原因。相反,它是指示客户端在此时中断脚本并将该部分作为批次发送。
因此,您最终会写出如下内容:
DROP VIEW IF EXISTS … ;
GO
CREATE VIEW … AS … ;
GO
None 我遇到的其他数据库服务器(PostgreSQL、MySQL、Oracle、SQLite)有这个怪癖,所以要求似乎仅限 Microsoft。
DROP VIEW if exists {ViewName}
Go
CREATE View {ViewName} AS
SELECT * from {TableName}
Go
我有一个脚本,我想先删除视图然后再创建它。 我知道如何删除 table:
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(......)
然后我得到错误:
'CREATE VIEW' must be the first statement in a query batch.
你现有的语法是错误的,你应该像下面这样将 DDL 与 go 分开
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
为了满足模式,请在 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
关于错误
'CREATE VIEW' must be the first statement in a query batch.
Microsoft SQL 服务器有一个奇怪的要求,即 CREATE VIEW
是批处理中的 only 语句。其他一些语句也是如此,例如 CREATE FUNCTION
。 不是 CREATE TABLE
的真实情况,所以去计算一下……
解决方案是将您的脚本小批量发送到服务器。一种方法是 select 一条语句并执行它。这显然很不方便。
更方便的解决方案是让客户端以独立的小批量发送脚本。
GO
关键字严格来说并不是 SQL 命令,这就是为什么你不能像真正的 SQL 命令那样以分号结尾的原因。相反,它是指示客户端在此时中断脚本并将该部分作为批次发送。
因此,您最终会写出如下内容:
DROP VIEW IF EXISTS … ;
GO
CREATE VIEW … AS … ;
GO
None 我遇到的其他数据库服务器(PostgreSQL、MySQL、Oracle、SQLite)有这个怪癖,所以要求似乎仅限 Microsoft。
DROP VIEW if exists {ViewName}
Go
CREATE View {ViewName} AS
SELECT * from {TableName}
Go