뷰가 데이터베이스에 있는지 어떻게 확인합니까?


127

특정 뷰가 데이터베이스에 존재하는 경우 실행 해야하는 SQL 코드가 있습니다. 뷰가 존재하는지 확인하려면 어떻게해야합니까?

편집 : 사용중인 DBMS는 Microsoft SQL Server입니다.

답변:


161

SQL 서버

IF EXISTS(select * FROM sys.views where name = '')

7
당신도 sys.schema여기 에 참여하고 싶을 것입니다.
Eric

오류-잘못된 개체 이름 'sys.views'. 나는 마스터 DB를 쿼리했다
증기

뷰에서 CREATE와 ALTER 사이에서 결정한 것으로 확인 된 경우 (이와 같이) VIEW에서는 작동하지 않습니다. VIEW *를 삭제 한 다음 CREATE해야합니다. IF EXISTS는 여전히 VIEW tho를 삭제하는 데 효과적입니다. 감사합니다! :) * 할 때 권한을 잊지 마십시오. ;)
FrostbiteXIII

이 시도. 존재하지 않는 경우보기 (스텁 만)를 작성한 다음 해당 스텁을 변경하여 업데이트를 넣습니다. 이렇게하면 삭제하지 않아도됩니다. structuredsight.com/2014/03/12/non-failing-scripts
kemiller2002

아마도 확인중인보기의 이름을 따옴표로 묶어야합니까? 그렇지 않으면 이것은 작동하지 않습니다 :)
리버스 엔지니어

138

위에서 지정한 많은 방법이 있지만 내가 가장 좋아하는 방법 중 하나가 없습니다.

GO
IF OBJECT_ID('nView', 'V') IS NOT NULL
    DROP VIEW nView;
GO

nView보기의 이름은 어디입니까?

업데이트 2017-03-25 : @hanesjw 는 두 번째 인수 P대신 저장 프로 시저 사용을 삭제하도록 제안했습니다.VOBJECT_ID

GO
IF OBJECT_ID( 'nProcedure', 'P' ) IS NOT NULL 
    DROP PROCEDURE dbo.sprocName; 
GO

4
난이게 좋아. 테이블에도 'u'를 사용할 수 있습니다.
Phillip Senn

2
저장 프로 시저의 경우 'P'. OBJECT_ID ( 'dbo.sprocName', 'P')가 NULL이 아닌 경우 DROP PROCEDURE dbo.sprocName; GO
hanesjw

이것이 2009 년에 가장 좋은 대답인지는 모르지만 2016 년 인 것 같습니다 (SQL Server 2016이 더 나은 옵션을 소개하지만).
Eric J.

1
OBJECT_ID 문서 msdn.microsoft.com/en-us/library/ms190328.aspx- 이 개체는 모든 개체 유형을 제공합니다. msdn.microsoft.com/en-us/library/ms190324.aspx
Simon_Weaver

55

이것은 가장 휴대하기 쉽고 방해가되지 않는 방법입니다.

select
    count(*)
from
    INFORMATION_SCHEMA.VIEWS
where
    table_name = 'MyView'
    and table_schema = 'MySchema'

편집 : 이것은 SQL Server에서 작동 sys.schemas하며 뷰의 스키마를 얻기 위해 가입 할 필요가 없습니다 . 모든 것이 중요하다면 덜 중요 dbo하지만 스키마를 잘 활용하고 있다면이를 명심해야합니다.

각 RDBMS에는 이와 같은 메타 데이터를 검사하는 자체적 인 작은 방법이 있지만 information_schema실제로는 ANSI이며 Oracle과 SQLite는 유일하게 어떤 방식으로 지원하지 않는 것으로 생각합니다.


3
SQLite는 사용하지 : SQL 오류 : 그런 테이블 : INFORMATION_SCHEMA.VIEWS

@lutz : +1, SQLite에 대한 지원 부족.
Alix Axel

18
if exists (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') )

Microsoft SQL Server의 경우 스키마 관리 스크립트를 작성할 때 IF EXISTS가 자주 사용되므로 이것이 가장 유용합니다. 스크립트에는 이미 CREATE ViEW [dbo]. [MyView]가 있으며 위의 복사 및 붙여 넣기를위한 가장 간단한 조각입니다.
Jimmy Bosse

15

존재 여부를 확인하는 사람들은 View이것을 사용하십시오.

에서 SQL Server 2016 CTP3당신은 새 사용할 수 있습니다 다이 문 대신 큰 IF래퍼를

통사론

DROP VIEW [존재하는 경우] [schema_name. ] view_name [..., n] [; ]

검색어 :

DROP VIEW IF EXISTS view_name

더 많은 정보는 여기에


1

Oracle 인 경우 "all_views"테이블을 사용합니다.

그것은 실제로 당신의 dbms에 달려 있습니다.


1

모든 기존 뷰의 유효성과 일관성을 확인하려면 다음 쿼리를 사용할 수 있습니다

declare @viewName sysname
declare @cmd sysname
DECLARE check_cursor CURSOR FOR 
SELECT cast('['+SCHEMA_NAME(schema_id)+'].['+name+']' as sysname) AS viewname
FROM sys.views

OPEN check_cursor
FETCH NEXT FROM check_cursor 
INTO @viewName

WHILE @@FETCH_STATUS = 0
BEGIN

set @cmd='select * from '+@viewName
begin try
exec (@cmd)
end try
begin catch
print 'Error: The view '+@viewName+' is corrupted .'
end catch
FETCH NEXT FROM check_cursor 
INTO @viewName
END 
CLOSE check_cursor;
DEALLOCATE check_cursor;

1

SQL Server에서

declare @ViewName nvarchar(20)='ViewNameExample'

if exists(SELECT 1 from sys.objects where object_Id=object_Id(@ViewName) and Type_Desc='VIEW')
begin
    -- Your SQL Code goes here ...

end

0

Kevin의 답변을 확장합니다.

    private bool CustomViewExists(string viewName)
    {
        using (SalesPad.Data.DataConnection dc = yourconnection)
        {
            System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(String.Format(@"IF EXISTS(select * FROM sys.views where name = '{0}')
                Select 1
            else
                Select 0", viewName));
            cmd.CommandType = CommandType.Text;
            return Convert.ToBoolean(dc.ExecuteScalar(cmd));
        }
    }

0

다양한 방법으로보기의 가용성을 확인할 수 있습니다

SQL 서버

sys.objects 사용

IF EXISTS(
   SELECT 1
   FROM   sys.objects
   WHERE  OBJECT_ID = OBJECT_ID('[schemaName].[ViewName]')
          AND Type_Desc = 'VIEW'
)
BEGIN
    PRINT 'View Exists'
END

sysobjects 사용

IF NOT EXISTS (
   SELECT 1
   FROM   sysobjects
   WHERE  NAME = '[schemaName].[ViewName]'
          AND xtype = 'V'
)
BEGIN
    PRINT 'View Exists'
END

sys.views 사용

IF EXISTS (
   SELECT 1
   FROM sys.views
   WHERE OBJECT_ID = OBJECT_ID(N'[schemaName].[ViewName]')
)
BEGIN
    PRINT 'View Exists'
END

INFORMATION_SCHEMA.VIEWS를 사용하십시오.

IF EXISTS (
   SELECT 1
   FROM   INFORMATION_SCHEMA.VIEWS
   WHERE  table_name = 'ViewName'
          AND table_schema = 'schemaName'
)
BEGIN
    PRINT 'View Exists'
END

OBJECT_ID 사용

IF EXISTS(
   SELECT OBJECT_ID('ViewName', 'V')
)
BEGIN
    PRINT 'View Exists'
END

sys.sql_modules 사용

IF EXISTS (
   SELECT 1
   FROM   sys.sql_modules
   WHERE  OBJECT_ID = OBJECT_ID('[schemaName].[ViewName]')
)
BEGIN
   PRINT 'View Exists'
END
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.