在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中是否有相同的功能可以做同樣的事情?
在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中是否有相同的功能可以做同樣的事情?
上述解決方案雖然可以完成任務,但可能會導致用戶權限下降。我更願意按照以下方式創建或替換視圖或存儲過程。
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
您可以使用'IF EXISTS'來檢查視圖是否存在,如果存在則放棄。
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'MyView') DROP VIEW MyView GO CREATE VIEW MyView AS .... GO
這裏的問題是,你失去的是可能有得到掉落的物體上存在的所有權限。 – simon 2011-09-14 14:39:04
我通常使用這樣的事:
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 [...]
這也適用於存儲過程,表等。 – Dave 2008-10-02 16:25:50
您可以使用ALTER更新視圖,但是這比甲骨文命令不同,因爲它只有在視圖已經存在的作品。 DaveK的回答可能會更好,因爲這將始終有效。
雖然ALTER保留現有的權限(如果新版本有語法錯誤等,保留舊版本)。因此,使用IF NOT EXISTS ...來創建一個存根,然後ALTER來替換它/原來可能會更好地維護權限和依賴關係。 – Kristen 2009-02-24 20:07:20
我用:
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
我認爲它我的腳本更具可讀性
僅供參考來自SQL Server 2016 SP1+
你可以使用CREATE OR ALTER VIEW
語法。
CREATE [ OR ALTER ] VIEW [ schema_name . ] view_name [ (column [ ,...n ]) ]
[ WITH <view_attribute> [ ,...n ] ]
AS select_statement
[ WITH CHECK OPTION ]
[ ; ]
或改變
有條件的改變,只有當它已經存在的視圖。
它工作正常,我的SQL Server 2017年上:
USE MSSQLTipsDemo
GO
CREATE OR ALTER PROC CreateOrAlterDemo
AS
BEGIN
SELECT TOP 10 * FROM [dbo].[CountryInfoNew]
END
GO
https://www.mssqltips.com/sqlservertip/4640/new-create-or-alter-statement-in-
我曾經是一個「滴」然後(重新)「添加」的人。但現在我傾向於這種類型的解決方案(如果不存在,則添加,然後改變)。 – granadaCoder 2012-08-06 13:44:45
修改視圖比刪除並重新創建方式更好。如果你有很多現有的用戶安全設置的視圖,那麼你將不得不重新創建所有這些。這是我解決這個問題的方法。 – jonas 2013-12-04 11:42:53
你的CREATE和ALTER做不同的事情......爲什麼? (一個人的動態,另一個不是,他們有不同的信息。) – 2015-03-12 16:43:44