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.