IT박스

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

itboxs 2020. 7. 27. 07:41
반응형

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


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

'IF EXISTS'를 사용하여 뷰가 있는지 확인하고 뷰가 있으면 드롭 할 수 있습니다.

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

뷰 생성 MyView
같이 
     ....
가다

참고로 구문을 SQL Server 2016 SP1+사용할 수 있습니다 CREATE OR ALTER VIEW.

MSDN 작성보기 :

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

또는 변경

뷰가 이미 존재하는 경우에만 조건부로 뷰를 변경합니다.

db <> 바이올린 데모


나는 사용한다:

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

변경 스크립트를 좀 더 읽기 쉽게 만듭니다.


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

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

SQL Server 2016부터

DROP TABLE IF EXISTS [foo];

MSDN 소스


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-


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


SQL Server 2016 이상에서 다음을 사용할 수 있습니다.

CREATE OR REPLACE VIEW VW_NAMEOFVIEW AS ...

이전 버전의 SQL Server에서는 다음과 같은 것을 사용해야합니다

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

참고 URL : https://stackoverflow.com/questions/163246/sql-server-equivalent-to-oracles-create-or-replace-view

반응형