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.