对于表,我可以如下实现“如果不存在”和“如果存在”:
--if table exists - drop
If OBJECT_ID('A','U') is not null
Drop Table [A]
--if table not exists - Create
If OBJECT_ID('A','U') is null
Create Table A([key] varchar(20), [value] varchar(max))
但它在视图和触发器上的工作方式并不完全相同
我可以:
-- if exists - drop
If OBJECT_ID('VA','V') is not null
Drop view [VA]
但是当我尝试相反时:
-- if not exists - create
If OBJECT_ID('VA','V') is null
Create view [VA] as Select * from [A]
我收到以下错误:
关键字“view”附近的语法不正确
触发器也是如此。当我做:
-- if not exists - create
If OBJECT_ID('Trigger_A_ins','TR') is null
Create trigger [Trigger_A_ins] On [A] instead of insert As
insert into A select * from inserted
我收到错误:
关键字“触发器”附近的语法不正确
但:
-- if exists - drop
If OBJECT_ID('Trigger_A_ins','TR') is not null
Drop Trigger Trigger_A_ins
正在工作中。
我错过了什么吗?
谁能解释表与触发器和视图之间的这种区别?
注意:我使用的是 sql server 2012
参考REMARKS 下CREATE VIEW的文档:
参考来自CREATE TRIGGER的文档
对于
VIEWS
andTRIGGERS
,我认为您必须检查对象的存在并放入一批中,然后在另一批中创建它们,并用 a 分隔GO
例子:
如果您在同一个批次上仍然需要这个,您可以使用动态 SQL。