SQL Server에 테이블이 있는지 확인


1143

SQL 문을 사용하여 SQL Server 2000/2005에 테이블이 있는지 확인하는 방법에 대한 궁극적 인 논의가되기를 바랍니다.

답변을 Google에 제공하면 다양한 답변을 얻을 수 있습니다. 공식 / 뒤로 및 앞으로 호환되는 방법이 있습니까?

가능한 두 가지 방법이 있습니다. 두 가지 중 어느 것이 표준 / 최고의 방법입니까?

첫 번째 방법 :

IF EXISTS (SELECT 1 
           FROM INFORMATION_SCHEMA.TABLES 
           WHERE TABLE_TYPE='BASE TABLE' 
           AND TABLE_NAME='mytablename') 
   SELECT 1 AS res ELSE SELECT 0 AS res;

두 번째 방법 :

IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

MySQL 은 간단한

SHOW TABLES LIKE '%tablename%'; 

성명서. 비슷한 것을 찾고 있습니다.


1
sys.tables 대신 INFORMATION_SCHEMA.TABLES를 사용하여 이름으로 필터링하는 것이 가장 좋은 이유는 무엇입니까? type_desc 값 검사를 추가하십시오.
— DanteTheSmith

답변:


1332

이와 같은 쿼리의 경우 항상 INFORMATION_SCHEMA보기 를 사용하는 것이 가장 좋습니다 . 이러한 뷰는 여러 데이터베이스에서 (대부분) 표준이며 버전마다 거의 변경되지 않습니다.

테이블이 존재하는지 확인하려면 다음을 사용하십시오.

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = 'TheSchema' 
                 AND  TABLE_NAME = 'TheTable'))
BEGIN
    --Do Stuff
END

12
잘 작동합니다! 그러나 T-SQL (원래 포스터에 대한 응답)에서는 SCHEMA_NAME이 아니라 TABLE_SCHEMA입니다. 팁 고마워.
— Nicholas Piasecki

10
개체 이름 만 (즉, 스키마가없는) 고유 한 것으로 보장되지 않는 경우이를 수행하는 100 % 비상 안전 방법이 없습니다. 스키마간에 이름 충돌이없는 DB로 작업하는 경우 "TABLE_SCHEMA = 'TheSchema'"를 생략하면됩니다.
— akmad

26
임시 테이블을 확인하려면, 우리는 tempdb의 데이터베이스를 조회해야하고 테이블 이름에 대한 LIKE 연산자를 사용SELECT * FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' AND TABLE_NAME LIKE '#TheTable%'
— 피에르 - 알랭 Vigeant

4
OBJECT_ID 함수를 사용하는 아래의 응답은 연결 당 임시 테이블과 관련하여 올바르게 작동합니다.- stackoverflow.com
— Rich Rousseau

4
@akmad SQL 쿼리 컴파일러는 쿼리를 실행하기 전에 테이블을 확인하고 시작하기 전에 실패합니다.
— Marc K

278

어떤 이유로 든 임시 테이블을 확인 해야하는 경우 다음을 수행 할 수 있습니다.

if OBJECT_ID('tempdb..#test') is not null
 --- temp table exists

10
이 방법을 사용하면 임시 테이블의 연결 별 특성을 고려하는 것 같습니다. 이전에 게시 된 INFORMATION_SCHEMA 쿼리는 테이블을 만든 연결에 관계없이 행을 반환합니다.
— Rich Rousseau

238

우리는 OBJECT_ID내가 기억 하는 한 항상 스타일을 사용합니다

IF OBJECT_ID('*objectName*', 'U') IS NOT NULL 

16
나는 그것이 휴대용이 아니지만 빠를 것이라고 믿습니다. 정보 스키마 뷰는 표준을 지원하는 모든 DBRMS에 존재합니다. 또한 일반 OBJECT_ID는 객체의 테이블을 보장하지 않습니다.
— Joe Pineda

9
고마워 Joe, 왜 OBJECT_ID 대 INFORMATION_SCHEMA.TABLES 대 sys.tables를 사용하는지 궁금합니다. INFORMATION_SCHEMA는 그 질문에 대한 표준의 일부라는 것을 지적했습니다. BTW이 질문을 할 데이터베이스 전문가 중 한 명이 당신과 같은 성을 가지고 있다는 것은 재밌습니다.
— Apeiron

24
@JoePineda : 그러면 OBJECT_ID('TableName', 'U')객체가 테이블임을 보장 하기 위해 사용 합니다.
— Allon Guralnek

1
@AllonGuralnek 그래서 간단하고 휴대용 표준을 따르는 대신 암호 정보를 추가하십시오.
— 정의

22
@DustinFineout : 질문에 tsql 태그가 지정 되었으므로 이식성이 그다지 적용되지 않습니다. 일반적으로 휴대 성이 거의없는 코드베이스는 거의 없었으며 간결성이 중요하다면 IF EXISTS허용 된 답변에서 그 쿼리를 반복해서 작성하는 것보다 확실히 좋습니다 . 또한 설명서를 읽을 때까지, 특히 T-SQL (또는 다른 변형)에서 모든 것이 암호화되어 있습니다.
— Allon Guralnek

132

아래의 접근법을 참조하십시오.

접근법 1 : INFORMATION_SCHEMA.TABLES 뷰 사용

Customers Table이 현재 데이터베이스에 있는지 확인하기 위해 아래와 같은 쿼리를 작성할 수 있습니다.

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'Customers')
BEGIN
    PRINT 'Table Exists'
END

접근법 2 : OBJECT_ID () 함수 사용

아래와 같이 OBJECT_ID () 함수를 사용하여 Customers Table이 현재 데이터베이스에 있는지 확인할 수 있습니다.

IF OBJECT_ID(N'dbo.Customers', N'U') IS NOT NULL
BEGIN
    PRINT 'Table Exists'
END

접근 방식 3 : sys.Objects 카탈로그 뷰 사용

Sys.Objects 카탈로그 뷰를 사용하여 아래와 같이 테이블이 있는지 확인할 수 있습니다.

IF EXISTS(SELECT 1 FROM sys.Objects WHERE  Object_id = OBJECT_ID(N'dbo.Customers') AND Type = N'U')
BEGIN
   PRINT 'Table Exists'
END

방법 4 : sys.Tables 카탈로그 뷰 사용

Sys.Tables 카탈로그 뷰를 사용하여 아래와 같이 테이블이 있는지 확인할 수 있습니다.

 IF EXISTS(SELECT 1 FROM sys.Tables WHERE  Name = N'Customers' AND Type = N'U')
 BEGIN
      PRINT 'Table Exists'
 END

접근 방식 5 : sys.sysobjects 시스템 테이블 사용 금지

sys.sysobjects 시스템 테이블을 직접 사용하지 말아야합니다. 이후 버전의 Sql Server에서는이 테이블에 직접 액세스 할 수 없습니다. Microsoft BOL 링크에 따라 Microsoft는 sys.sysobjects 시스템 테이블 대신 카탈로그 뷰 sys.objects / sys.tables를 직접 사용하는 것이 좋습니다.

  IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Customers' AND xtype = N'U')
  BEGIN
     PRINT 'Table Exists'
  END

참조 : http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/


37

다른 데이터베이스에서 테이블을 찾고 있습니다.

if exists (select * from MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'

26

OBJECT_ID방법 을 사용하는 것이 조금 더 쉬운 상황을 언급하고 싶었습니다 . INFORMATION_SCHEMA보기는 각 데이터베이스 - 아래 개체

정보 스키마 뷰는 INFORMATION_SCHEMA라는 특수 스키마에 정의되어 있습니다. 이 스키마는 각 데이터베이스에 포함되어 있습니다.

https://msdn.microsoft.com/en-us/library/ms186778.aspx

따라서 사용하는 모든 테이블을 사용하여

IF EXISTS (SELECT 1 
           FROM [database].INFORMATION_SCHEMA.TABLES 
           WHERE TABLE_TYPE='BASE TABLE' 
           AND TABLE_NAME='mytablename') 
   SELECT 1 AS res ELSE SELECT 0 AS res;

에있는 내용 만 반영합니다 [database]. 매번 동적으로 변경하지 않고 다른 데이터베이스의 테이블이 존재 하는지 확인 하려면 즉시 사용할 수 있습니다. 전의-[database]OBJECT_ID

IF OBJECT_ID (N'db1.schema.table1', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

뿐만 아니라 작동

IF OBJECT_ID (N'db2.schema.table1', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

SQL Server 2016 편집 :

2016 년부터 Microsoft는 삭제하기 전에 if exists키워드를 drop문 에 추가하여 존재하지 않는 개체를 확인하는 기능을 단순화했습니다 . 예를 들어

drop table if exists mytablename

한 줄의 코드에서 OBJECT_ID/ INFORMATION_SCHEMA래퍼 와 동일한 작업을 수행합니다 .

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/



13

정보 스키마를 사용하는 것이 SQL 표준 방법이므로이를 지원하는 모든 데이터베이스에서 사용해야합니다.


12
이것은 주석이었을 것입니다.
— underscore_d

3
이 답변은 개선이 필요합니다.
— rory.ap

11
IF EXISTS 
(
    SELECT   * 
    FROM     sys.objects 
    WHERE    object_id = OBJECT_ID(N'[dbo].[Mapping_APCToFANavigator]') 
             AND 
             type in (N'U')
)
BEGIN

    -- Do whatever you need to here.

END

위 코드에서 테이블 이름은 Mapping_APCToFANavigator입니다.


2
당신이 포스트 코드, XML 또는 데이터 샘플, 경우 하시기 바랍니다 텍스트 편집기에서 그 라인을 강조하고 "코드 샘플"버튼 (클릭 { }친절에 편집기 도구 모음) 형식 및 구문을 강조!
— marc_s 2016 년

1
이후 버전의 SQL Server에서는 시스템 테이블에 대한 액세스가 중단 될 수 있습니다. 대신 스키마보기를 사용하십시오.
— Olivier Jacot-Descombes

10

다른 데이터베이스에서 작업해야하는 경우 :

DECLARE @Catalog VARCHAR(255)
SET @Catalog = 'MyDatabase'

DECLARE @Schema VARCHAR(255)
SET @Schema = 'dbo'

DECLARE @Table VARCHAR(255)
SET @Table = 'MyTable'

IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES   
    WHERE TABLE_CATALOG = @Catalog 
      AND TABLE_SCHEMA = @Schema 
      AND TABLE_NAME = @Table))
BEGIN
   --do stuff
END

1
확실해? 내 2005 상자의 정보 스키마는 현재 카탈로그 만 반환합니다.
— quillbreaker

8

나는 그것이 오래된 질문이라는 것을 알고 있지만 자주 전화 할 계획이라면이 가능성을 발견했습니다.

create procedure Table_Exists
@tbl varchar(50)
as
return (select count(*) from sysobjects where type = 'U' and name = @tbl)
go

9
-1. 단순히 선택하는 것만 큼 호출을 호출하고 소비하는 코드만큼 많은 절차가 필요합니다. sysnamedatatype not을 사용해야합니다 varchar(50). 더 이상 사용되지 않는 sysobjects보기를 사용하지 않아야 하며 스키마를 고려하지 않습니다.
— Martin Smith

6

아래 코드를 사용할 수 있습니다

IF (OBJECT_ID('TableName') IS NOT NULL )
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END

또는

IF (EXISTS (SELECT * FROM sys.tables WHERE [name] = 'TableName'))
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END

5

개발자와 동료 DBA의 이익을 위해 여기에 추가하기 만하면됩니다.

@Tablename을 매개 변수로받는 스크립트

(스키마 이름을 포함하거나 포함하지 않을 수 있음) 및 schema.table이 존재하면 아래 정보를 반환합니다.

the_name                object_id   the_schema  the_table       the_type
[Facts].[FactBackOrder] 758293761   Facts       FactBackOrder   Table

테이블이나 뷰가 존재하는지 여부를 테스트해야 할 때마다 다른 스크립트에서 사용되도록이 스크립트를 생성했으며, 존재하는 경우 다른 목적으로 사용할 object_id를 가져옵니다.

빈 문자열, 잘못된 스키마 이름 또는 잘못된 테이블 이름을 전달하면 오류가 발생합니다.

이것은 프로 시저 내부에있을 수 있으며 예를 들어 -1을 리턴합니다.

예를 들어, Data Warehouse 데이터베이스 중 하나에 "Facts.FactBackOrder"라는 테이블이 있습니다.

이것이 내가 이것을 달성 한 방법입니다.

PRINT 'THE SERVER IS ' + @@SERVERNAME
--select db_name()
PRINT 'THE DATABASE IS ' + db_NAME() 
PRINT ''
GO

SET NOCOUNT ON
GO

--===================================================================================
-- @TableName is the parameter
-- the object we want to deal with (it might be an indexed view or a table)
-- the schema might or might not be specified
-- when not specified it is DBO
--===================================================================================

DECLARE @TableName SYSNAME

SELECT @TableName = 'Facts.FactBackOrder'
--===================================================================================
--===================================================================================
DECLARE @Schema SYSNAME
DECLARE @I INT
DECLARE @Z INT 

SELECT @TableName = LTRIM(RTRIM(@TableName))
SELECT @Z = LEN(@TableName)

IF (@Z = 0) BEGIN

            RAISERROR('Invalid @Tablename passed.',16,1)

END 

SELECT @I = CHARINDEX('.',@TableName )
--SELECT @TableName ,@I

IF @I > 0 BEGIN

        --===================================================================================
        -- a schema and table name have been passed
        -- example Facts.FactBackOrder 
        -- @Schema = Fact
        -- @TableName = FactBackOrder
        --===================================================================================

   SELECT @Schema    = SUBSTRING(@TABLENAME,1,@I-1)
   SELECT @TableName = SUBSTRING(@TABLENAME,@I+1,@Z-@I)



END
ELSE BEGIN

        --===================================================================================
        -- just a table name have been passed
        -- so the schema will be dbo
        -- example Orders
        -- @Schema = dbo
        -- @TableName = Orders
        --===================================================================================

   SELECT @Schema    = 'DBO'     


END

        --===================================================================================
        -- Check whether the @SchemaName is valid in the current database
        --===================================================================================

IF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.SCHEMATA K WHERE K.[SCHEMA_NAME] = @Schema ) BEGIN

            RAISERROR('Invalid Schema Name.',16,1)

END 

--SELECT @Schema  as [@Schema]
--      ,@TableName as [@TableName]


DECLARE @R1 TABLE (

   THE_NAME SYSNAME
  ,THE_SCHEMA SYSNAME
  ,THE_TABLE SYSNAME
  ,OBJECT_ID INT
  ,THE_TYPE SYSNAME
  ,PRIMARY KEY CLUSTERED (THE_SCHEMA,THE_NAME)

)

;WITH RADHE_01 AS (
SELECT QUOTENAME(SCHEMA_NAME(O.schema_id)) + '.' + QUOTENAME(O.NAME) AS [the_name]
      ,the_schema=SCHEMA_NAME(O.schema_id)
      ,the_table=O.NAME
      ,object_id =o.object_id 
      ,[the_type]= CASE WHEN O.TYPE = 'U' THEN 'Table' ELSE 'View' END 
from sys.objects O
where O.is_ms_shipped = 0
AND O.TYPE IN ('U','V')
)
INSERT INTO @R1 (
   THE_NAME 
  ,THE_SCHEMA 
  ,THE_TABLE 
  ,OBJECT_ID
  ,THE_TYPE 
)
SELECT  the_name
       ,the_schema
       ,the_table
       ,object_id
       ,the_type
FROM RADHE_01
WHERE the_schema = @Schema 
  AND the_table  = @TableName

IF (@@ROWCOUNT = 0) BEGIN 

             RAISERROR('Invalid Table Name.',16,1)

END 
ELSE BEGIN

    SELECT     THE_NAME 
              ,THE_SCHEMA 
              ,THE_TABLE 
              ,OBJECT_ID
              ,THE_TYPE 

    FROM @R1

END 

스크립트에는 많은 가정이 있습니다. 예를 들어, 이름이 지정된 테이블을 쉽게 열람 할 수 dbo.[hello.world ]있으며 스크립트는 여러 가지 이유로 테이블을 찾지 못합니다. 즉, 아무도 그러한 테이블을 만들고 싶지는 않지만 여전히 그렇습니다. 어쨌든, THE_NAME열은 sysname', yet you try to squeeze 2 sysname 열과 점 ( .) 으로 정의되며 모두 대괄호로 묶여 있습니다. 언젠가는 실패 할 것입니다!
— deroby

@deroby sysname은 사용하기에 가장 좋은 데이터 유형이 아니라는 데 동의하지만 스크립트는 오류없이 오랫동안 실행되어 왔으며 작동하지 않는 합리적인 상황을 찾은 경우에만 시간을 소비합니다. 더 좋은 방법은,이 코드를 가져 와서 개선하고 여기에 답변으로 게시 한 다음 테스트하면 작동합니다.
— Marcello Miorelli

5

SQL Server 2000 에서는 다음을 시도 할 수 있습니다.

IF EXISTS(SELECT 1 FROM sysobjects WHERE type = 'U' and name = 'MYTABLENAME')
BEGIN
   SELECT 1 AS 'res' 
END

3
IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

    WHERE   TABLE_SCHEMA = 'PutSchemaHere'     
            AND  
            TABLE_NAME   = 'PutTableNameHere'
)

2

솔루션을 아직 찾지 못한 사람에게 알아야 할 중요한 사항 : SQL server! = MYSQL . MYSQL로 하고 싶다면 아주 간단합니다.

    $sql = "SELECT 1 FROM `db_name`.`table_name` LIMIT 1;";
    $result = mysql_query($sql);
    if( $result == false )
        echo "table DOES NOT EXIST";
    else
        echo "table exists";

Google에서 가장 큰 인기를 끌기 때문에 여기에 게시하십시오.


4
OP는 MySQL이 아니라 문제에 대한 SQL Server 솔루션을 정확하게 요구하기 때문에 -1입니다. 그는 해당 DBMS에 대한 솔루션을 알고 있기 때문에 MySQL에 대해 작성했으며 SQL Server에서도 동일한 결과를 원했습니다. 또한 귀하의 답변은 MySQL 쿼리가 아니라 MySQL과 작동하는 PHP 코드입니다.
— mordack550

1
@ mordack550, 나는 Blauhirn에 동의합니다. 그가 맞아. 이것은 테이블이 SQL에 존재하는지 알아 낸 Google에서 가장 큰 인기입니다. 그는 의도가 좋고 그의 정보가 도움이됩니다. +1
— Mark

불행히도 Microsoft는 SQL과 같은 일반적인 표준과 패턴을 수용 / 연장 / 소멸하려는 습관을 가지고 있습니다. 사람들이 자신의 제품과 관련된 참조를 명확하게 식별 할 수 있도록 SQL 서버 구현에 적절한 이름을 부여했으면합니다.
— psaxton

2
IF EXISTS (   SELECT * FROM   dbo.sysobjects WHERE  id = OBJECT_ID(N'dbo.TableName') AND OBJECTPROPERTY(id, N'IsUserTable') = 1 )
BEGIN
  SELECT * FROM dbo.TableName;
END
GO

2

이것을 사용할 수 있습니다 :

     IF OBJECT_ID (N'dbo.T', N'U') IS NOT NULL 
        BEGIN 
            print 'deleted table';
            drop table t 
        END
     else 
        begin 
            print 'table not found' 
        end

 Create table t (id int identity(1,1) not null, name varchar(30) not null, lastname varchar(25) null)
 insert into t( name, lastname) values('john','doe');
 insert into t( name, lastname) values('rose',NULL);

 Select * from t
1   john    doe
2   rose    NULL

 -- clean
 drop table t

1
select name from SysObjects where xType='U' and name like '%xxx%' order by name

1

--테이블이 존재하는지 확인하는 프로 시저 작성


DELIMITER $$

DROP PROCEDURE IF EXISTS `checkIfTableExists`;

CREATE PROCEDURE checkIfTableExists(
    IN databaseName CHAR(255),
    IN tableName CHAR(255),
    OUT boolExistsOrNot CHAR(40)
)

  BEGIN
      SELECT count(*) INTO boolExistsOrNot FROM information_schema.TABLES
      WHERE (TABLE_SCHEMA = databaseName)
      AND (TABLE_NAME = tableName);
  END $$

DELIMITER ;

--사용 방법 : 테이블 마이그레이션이 존재하는지 확인


 CALL checkIfTableExists('muDbName', 'migrations', @output);

1
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE 
TABLE_CATALOG = 'Database Name' and
TABLE_NAME = 'Table Name' and 
TABLE_SCHEMA = 'Schema Name') -- Database and Schema name in where statement can be deleted

BEGIN
--TABLE EXISTS
END

ELSE BEGIN
--TABLE DOES NOT EXISTS
END

1

여기 복용 예로서 도면을 작성 .

ALTER / CREATE 명령은 BEGIN / END 블록 내에있을 수 없기 때문입니다. 존재를 테스트하고 작성하기 전에 삭제해야합니다.

IF Object_ID('TestView') IS NOT NULL
DROP VIEW TestView

GO

CREATE VIEW TestView
   as
   . . .

GO

사용 권한 손실에 대해 염려가된다면 GRANT 문을 스크립팅하고 마지막에 다시 실행할 수 있습니다.

작성 / 변경을 문자열로 감싸고 EXEC를 수행 할 수 있습니다-큰보기에는 추악 할 수 있습니다

DECLARE @SQL as varchar(4000)

-- set to body of view
SET @SQL = 'SELECT X, Y, Z FROM TABLE' 

IF Object_ID('TestView') IS NULL
    SET @SQL = 'CREATE VIEW TestView AS ' + @SQL
ELSE    
    SET @SQL = 'ALTER VIEW TestView AS ' + @SQL

0

linq to sql (또는 특히 linqpad)에서 동일한 작업을 수행하려는 경우 시스템 테이블과 뷰를 포함 하고이 코드를 수행하는 옵션을 설정하십시오.

let oSchema = sys.Schemas.FirstOrDefault(s=>s.Name==a.schema )
where oSchema !=null
let o=oSchema!=null?sys.Objects.FirstOrDefault (o => o.Name==a.item && o.Schema_id==oSchema.Schema_id):null
where o!=null

item이라는 속성에 이름을 가진 객체가 있고 소스 변수 이름이 schema 인 schema라는 속성에 스키마가있는 경우 a


0

이것이 '궁극적 인'토론이 되려면 Larry Leonard의 스크립트가 서버가 연결되어있는 경우 원격 서버를 쿼리 할 수 ​​있습니다.

if exists (select * from REMOTE_SERVER.MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'

아마도 이것을 Leonards의 답변에 대한 의견이나 편집으로 추가하는 것이 더 적합합니까?
— EWit

0

INFORMATIONAL_SCHEME 및 OBJECT_ID에서 선택하는 데 문제가 있습니다. ODBC 드라이버 나 다른 문제인지 잘 모르겠습니다. SQL Management Studio의 쿼리 모두 괜찮 았습니다.

해결책은 다음과 같습니다.

SELECT COUNT(*) FROM <yourTableNameHere>

따라서 쿼리가 실패하면 데이터베이스에 해당 테이블이 없거나 액세스 권한이없는 것입니다.

ODBC 드라이버를 처리하는 SQL executor가 리턴 한 값 (필자의 경우 정수)을 비교하여 점검합니다.

if (sqlexec(conectionHandle, 'SELECT COUNT(*) FROM myTable') == -1) {
  // myTable doesn't exist..
}

어떤 출력으로 실패합니까?
— wscourge 2016 년

@wscourge, SQL 쿼리 실패 또는 이와 유사한 것. executor 함수에서 반환 값을 확인합니다.
— Michael Quad

답변에 추가하십시오
— wscourge

0

데이터베이스에 테이블이 있는지 확인하는 옵션이 하나 더 있습니다.

IF EXISTS(SELECT 1 FROM [change-to-your-database].SYS.TABLES WHERE NAME = 'change-to-your-table-name')
BEGIN
    -- do whatever you want
END

-1

이 쿼리를 실행하여 데이터베이스에 테이블이 있는지 확인하십시오.

IF(SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'YourTableName') IS NOT NULL
PRINT 'Table Exists';

-6

하나의 데이터베이스에서 테이블 t1을 고려하십시오. t1이 존재하면 t1을 생성하는 다른 작업을 수행하지 마십시오. 이 열린 Visual Studio를 수행하고 다음을 수행하십시오.

t1을 마우스 오른쪽 단추로 클릭 한 다음 스크립트 테이블을 다음 DROP 및 작성 대상을 클릭 한 다음 새 쿼리 편집기

원하는 검색어를 찾을 수 있습니다. 그러나 해당 스크립트를 실행하기 전에 쿼리에서 drop 문을 주석 처리하는 것을 잊지 마십시오. 이미있는 경우 새 명령문을 만들고 싶지 않습니다.

감사


SSMS 2012에서는 더 이상 존재하지 않는 경우 더 이상 존재하지 않는 검사를 수행하지 않습니다 (이전 버전이 위의 스크립트를 어떻게 생성했는지 기억이 나지 않습니다). 어쩌면 다른 db 도구가 테이블 객체를 스크립팅하는 방식에 실수가 있습니까?
— Ivaylo Slavov

요청하면 SSMS가 존재 여부 확인을 수행합니다. 도구> 옵션> SQL Server 개체 탐색기> 스크립팅> "개체 스크립팅 옵션": "개체 존재 확인"= True
— Seann Alexander
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.