2008-10-02 81 views
94

在Oracle中,我可以重新创建一个单独的语句,视图,如下所示:服务器相当于Oracle的CREATE OR REPLACE查看SQL

CREATE OR REPLACE VIEW MY_VIEW AS 
SELECT SOME_FIELD 
FROM SOME_TABLE 
WHERE SOME_CONDITIONS 

由于语法意味着,这将删除旧的视图和用我给出的任何定义重新创建它。

在SQL Server 2005中是否有相同的功能可以做同样的事情?

回答

90

上述解决方案虽然可以完成任务,但可能会导致用户权限下降。我更愿意按照以下方式创建或替换视图或存储过程。

IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[vw_myView]')) 
    EXEC sp_executesql N'CREATE VIEW [dbo].[vw_myView] AS SELECT ''This is a code stub which will be replaced by an Alter Statement'' as [code_stub]' 
GO 

ALTER VIEW [dbo].[vw_myView] 
AS 
SELECT 'This is a code which should be replaced by the real code for your view' as [real_code] 
GO 
+2

我曾经是一个“滴”然后(重新)“添加”的人。但现在我倾向于这种类型的解决方案(如果不存在,则添加,然后改变)。 – granadaCoder 2012-08-06 13:44:45

+0

修改视图比删除并重新创建方式更好。如果你有很多现有的用户安全设置的视图,那么你将不得不重新创建所有这些。这是我解决这个问题的方法。 – jonas 2013-12-04 11:42:53

+0

你的CREATE和ALTER做不同的事情......为什么? (一个人的动态,另一个不是,他们有不同的信息。) – 2015-03-12 16:43:44

43

您可以使用'IF EXISTS'来检查视图是否存在,如果存在则放弃。

 
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS 
     WHERE TABLE_NAME = 'MyView') 
    DROP VIEW MyView 
GO 

CREATE VIEW MyView 
AS 
    .... 
GO 
+10

这里的问题是,你失去的是可能有得到掉落的物体上存在的所有权限。 – simon 2011-09-14 14:39:04

6

我通常使用这样的事:

if exists (select * from dbo.sysobjects 
    where id = object_id(N'dbo.MyView') and 
    OBJECTPROPERTY(id, N'IsView') = 1) 
drop view dbo.MyView 
go 
create view dbo.MyView [...] 
+0

这也适用于存储过程,表等。 – Dave 2008-10-02 16:25:50

2

您可以使用ALTER更新视图,但是这比甲骨文命令不同,因为它只有在视图已经存在的作品。 DaveK的回答可能会更好,因为这将始终有效。

+1

虽然ALTER保留现有的权限(如果新版本有语法错误等,保留旧版本)。因此,使用IF NOT EXISTS ...来创建一个存根,然后ALTER来替换它/原来可能会更好地维护权限和依赖关系。 – Kristen 2009-02-24 20:07:20

12

我用:

IF OBJECT_ID('[dbo].[myView]') IS NOT NULL 
DROP VIEW [dbo].[myView] 
GO 
CREATE VIEW [dbo].[myView] 
AS 

...

最近我加入了一些实用程序这种东西:

CREATE PROCEDURE dbo.DropView 
@ASchema VARCHAR(100), 
@AView VARCHAR(100) 
AS 
BEGIN 
    DECLARE @sql VARCHAR(1000); 
    IF OBJECT_ID('[' + @ASchema + '].[' + @AView + ']') IS NOT NULL 
    BEGIN 
    SET @sql = 'DROP VIEW ' + '[' + @ASchema + '].[' + @AView + '] '; 
    EXEC(@sql); 
    END 
END 

所以,现在我写

EXEC dbo.DropView 'mySchema', 'myView' 
GO 
CREATE View myView 
... 
GO 

我认为它我的脚本更具可读性

4

与SQL Server 2016,你有

DROP TABLE IF EXISTS [foo]; 

MSDN source

14

仅供参考来自SQL Server 2016 SP1+你可以使用CREATE OR ALTER VIEW语法。

MSDN CREATE VIEW

CREATE [ OR ALTER ] VIEW [ schema_name . ] view_name [ (column [ ,...n ]) ] 
[ WITH <view_attribute> [ ,...n ] ] 
AS select_statement 
[ WITH CHECK OPTION ] 
[ ; ] 

或改变

有条件的改变,只有当它已经存在的视图。