Oracle에서는 다음과 같이 단일 문으로 뷰를 다시 만들 수 있습니다.
CREATE OR REPLACE VIEW MY_VIEW AS
SELECT SOME_FIELD
FROM SOME_TABLE
WHERE SOME_CONDITIONS
구문에서 알 수 있듯이 이것은 이전 뷰를 삭제하고 내가 지정한 정의로 다시 생성합니다.
동일한 작업을 수행하는 MSSQL (SQL Server 2005 이상)에 동등한 기능이 있습니까?
Oracle에서는 다음과 같이 단일 문으로 뷰를 다시 만들 수 있습니다.
CREATE OR REPLACE VIEW MY_VIEW AS
SELECT SOME_FIELD
FROM SOME_TABLE
WHERE SOME_CONDITIONS
구문에서 알 수 있듯이 이것은 이전 뷰를 삭제하고 내가 지정한 정의로 다시 생성합니다.
동일한 작업을 수행하는 MSSQL (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
참조를 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 ] [ ; ]또는 변경
뷰가 이미있는 경우에만 조건부로 변경합니다.
나는 사용한다:
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 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-
SQL Server 2016 이상에서는 다음을 사용할 수 있습니다.
CREATE OR ALTER VIEW VW_NAMEOFVIEW AS ...
이전 버전의 SQL 서버에서는 다음과 같은 것을 사용해야합니다.
DECLARE @script NVARCHAR(MAX) = N'VIEW [dbo].[VW_NAMEOFVIEW] AS ...';
IF NOT EXISTS(SELECT * FROM sys.views WHERE name = 'VW_NAMEOFVIEW')
-- IF OBJECT_ID('[dbo].[VW_NAMEOFVIEW]') IS NOT NULL
BEGIN EXEC('CREATE ' + @script) END
ELSE
BEGIN EXEC('ALTER ' + @script) END
또는 뷰에 대한 종속성이없는 경우 뷰를 삭제하고 다시 만들 수 있습니다.
IF EXISTS(SELECT * FROM sys.views WHERE name = 'VW_NAMEOFVIEW')
-- IF OBJECT_ID('[dbo].[VW_NAMEOFVIEW]') IS NOT NULL
BEGIN
DROP VIEW [VW_NAMEOFVIEW];
END
CREATE VIEW [VW_NAMEOFVIEW] AS ...
CREATE OR REPLACE VIEW구문을 사용할 수 없습니다 . 올바른 구문은 CREATE OR ALTER VIEW입니다. 어떻게, everybdody는 CREATE OR REPLACE내가 찾은 다른 모든 SO 스레드에 있다고 말합니다 🤔