Oracle의 CREATE OR REPLACE VIEW에 해당하는 SQL Server


115

Oracle에서는 다음과 같이 단일 문으로 뷰를 다시 만들 수 있습니다.

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

구문에서 알 수 있듯이 이것은 이전 뷰를 삭제하고 내가 지정한 정의로 다시 생성합니다.

동일한 작업을 수행하는 MSSQL (SQL Server 2005 이상)에 동등한 기능이 있습니까?

답변:


103

위의 솔루션은 작업을 완료하지만 사용자 권한이 떨어질 위험이 있습니다. 다음과 같이 뷰 또는 저장 프로 시저를 만들거나 바꾸는 것을 선호합니다.

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

보기를 변경하는 것이 삭제하고 다시 만드는 것보다 훨씬 낫습니다. 뷰에 대해 기존 사용자 보안 설정이 많으면 모든 것을 다시 만들어야합니다. 이것이이 문제에 대한 나의 접근 방식입니다.
— 조나스

CREATE와 ALTER는 다른 일을합니다 .... 왜? (하나의 역동적 인, 다른의하지, 그들은 서로 다른 메시지가 있습니다.)
— 제이 설리반

CREATE VIEW 문이 "Alter Statement로 대체 됨"과 관련된 방식을 혼란스럽게 생각합니다. 그게 무슨 뜻입니까? 또한 여기서 실제로 어떤 코드를 대체해야하는지, 어떻게해야하는지 명확하지 않습니다. 나는 당신의 대답에 혼란스러워하는 몇 안되는 사람 중 한 명일 것입니다.
— Kyle Julé 2015 년

2
SQL Server 2016 SP1 +의 경우 lad2025의 답변을 참조하세요.
— MBWise 2017

45

'IF EXISTS'를 사용하여 뷰가 존재하는지 확인하고 있다면 삭제할 수 있습니다.

존재하는 경우 (INFO_SCHEMA.VIEWS에서 TABLE_NAME 선택
        WHERE TABLE_NAME = 'MyView')
    드롭 뷰 MyView
가다

보기 MyView 만들기
같이 
     ....
가다

13
이것의 문제점은 삭제 된 객체에 존재했을 수있는 권한을 잃는다는 것입니다.
— 사이먼

37

참조를 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 ]   
[ ; ]

또는 변경

뷰가 이미있는 경우에만 조건부로 변경합니다.

db <> 바이올린 데모


그것은 구문입니다. ORACLE 에서처럼 CREATE 및 ALTER 키워드를 동시에 사용할 수는 없습니다. 이렇게 시도하면 아래 오류가 발생합니다. -키워드 'OR'근처에 잘못된 구문이 있습니다. - 'CREATE / ALTER PROCEDURE'는 쿼리 일괄 처리에서 첫 번째 문이어야합니다.
— Div Tiwari

3
@DivTiwari, 이것은 분명히 SQL 2016에서 유효합니다. SQL Server가이 오라클 기능을 따라 잡는데 11 년 밖에 걸리지
— 않았습니다.

1
@JosephStyons 사실, 당신이 맞습니다! 나는 그들이 어떻게 그렇게 중요한 기능을 그렇게 오랫동안 놓쳤는 지 이해하지 못합니다.
— Div Tiwari

@DivTiwari 개발자의 선택 이었습니다 : CREATE OR ALTER 더 늦게까지 :)
— Lukasz

14

나는 사용한다:

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

내 변경 스크립트를 좀 더 읽기 쉽게 만든다고 생각합니다.


7

나는 일반적으로 다음과 같은 것을 사용합니다.

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 [...]



2

ALTER를 사용하여보기를 업데이트 할 수 있지만보기가 이미있는 경우에만 작동하므로 Oracle 명령과 다릅니다. 그것은 항상 작동하기 때문에 DaveK의 대답으로 아마 더 나을 것입니다.


1
ALTER는 기존 권한을 유지하지만 새 버전에 구문 오류 등이있는 경우 이전 버전을 유지합니다. 따라서 IF NOT EXISTS ...를 사용하여 Stub을 만든 다음 ALTER를 사용하여 원본 / 원본을 대체하는 것이 권한 및 종속성을 유지하는 데 더 좋을 수 있습니다.
— Kristen

1

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 ...

1
SQL Server 2016 이상을 사용하고 있으며 CREATE OR REPLACE VIEW구문을 사용할 수 없습니다 . 올바른 구문은 CREATE OR ALTER VIEW입니다. 어떻게, everybdody는 CREATE OR REPLACE내가 찾은 다른 모든 SO 스레드에 있다고 말합니다 🤔
— WoIIe

@Wolle, CREATE OR REPLACE는 Oracle의 구문입니다 (질문 참조)
— Eugene Lycenok
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.