programing

뷰 삭제(존재하는 경우)

bestprogram 2023. 8. 15. 11:19

뷰 삭제(존재하는 경우)

먼저 보기를 삭제한 다음 만들 스크립트가 있습니다.테이블을 내리는 방법을 알고 있습니다.

IF EXISTS (SELECT * FROM sys.tables WHERE name = 'table1' AND type = 'U') DROP TABLE table1;

그래서 저는 뷰에 대해서도 똑같이 했습니다.

IF EXISTS (SELECT * FROM sys.views WHERE name = 'view1' AND type = 'U') DROP VIEW view1;
create view1 as(......)

그리고 오류가 발생했습니다.

'CREATE VIEW'는 쿼리 배치의 첫 번째 문이어야 합니다.

당신의 기존 구문이 잘못되었으며 아래와 같이 DDL을 분리해야 합니다.

if exists(select 1 from sys.views where name='tst' and type='v')
drop view tst;
go

create view tst
as
select * from test

또한 아래와 같이 object_id로 존재 테스트를 확인할 수 있습니다.

if object_id('tst','v') is not null
drop view tst;
go

create view tst
as
select * from test

SQL 2016에서 아래 구문을 사용하여 삭제할 수 있습니다.

Drop view  if exists dbo.tst

SQL 2016 CU1에서 다음을 수행할 수 있습니다.

create or alter view vwTest
as
 select 1 as col;
go

오류와 관련하여

'CREATE VIEW' must be the first statement in a query batch.

Microsoft SQL Server에는 다음과 같은 까다로운 요구 사항이 있습니다.CREATE VIEW일괄 처리의 유일한 문입니다.이는 다음과 같은 몇 가지 다른 진술에도 해당됩니다.CREATE FUNCTION그것은 사실이 아닙니다.CREATE TABLE그러니깐 가서 계산해봐요.

해결책은 스크립트를 소규모 배치로 서버로 보내는 것입니다.한 가지 방법은 단일 문을 선택하고 실행하는 것입니다.이것은 분명히 불편합니다.

더 편리한 솔루션은 클라이언트가 스크립트를 소규모로 격리된 배치로 전송하도록 하는 것입니다.

GO키워드는 엄밀하게 SQL 명령어가 아니므로 실제 SQL 명령어처럼 세미콜론으로 끝낼 수 없습니다.대신 이 시점에서 스크립트를 중단하고 해당 부분을 일괄 전송하라는 지시입니다.

결과적으로 다음과 같은 글을 쓰게 됩니다.

DROP VIEW IF EXISTS … ;
GO
CREATE VIEW … AS … ;
GO

다른 데이터베이스 서버가 없습니다(Postgre).SQL, MySQL, Oracle, SQLite)에는 이와 같은 특이성이 있으므로 요구 사항은 Microsoft Only로 나타납니다.

DROP VIEW if exists {ViewName}
Go
CREATE View {ViewName} AS 
SELECT * from {TableName}  
Go

스키마도 충족하려면 SQL 2014에서 이 형식을 사용합니다.

if exists(select 1 from sys.views V inner join sys.[schemas] S on  v.schema_id = s.schema_id where s.name='dbo' and v.name = 'someviewname' and v.type = 'v')
  drop view [dbo].[someviewname];
go

저장 프로시저를 만들기 위해 그것을 밖에 버리는 것도 필요했기 때문입니다.

if exists(select 1
          from sys.procedures p
          inner join sys.[schemas] S on p.schema_id = s.schema_id
          where
              s.name='dbo' and p.name = 'someprocname'
          and p.type in ('p', 'pc')
  drop procedure [dbo].[someprocname];
go

언급URL : https://stackoverflow.com/questions/36133752/drop-view-if-exists