your programing

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

lovepro 2020. 9. 27. 13:33
반응형

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


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%'; 

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


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

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

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

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

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

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

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

아래 접근 방식을 참조하십시오.

접근 방식 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 서버의 일부 향후 버전에서 더 이상 사용되지 않습니다. 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/


다른 데이터베이스에서 테이블 찾기 :

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

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_SCHEMAwrappers 와 동일한 작업을 수행합니다 .

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


IF OBJECT_ID('mytablename') IS NOT NULL 

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


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입니다.


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

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

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

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

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

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

(스키마 이름을 포함 할 수도 있고 포함하지 않을 수도 있음) schema.table이있는 경우 아래 정보를 반환합니다.

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

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

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

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

예를 들어, 데이터웨어 하우스 데이터베이스 중 하나에 "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 

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

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

IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

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

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

     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

아직 솔루션을 찾지 못한 사람을 위해 알아야 할 중요한 사항 : 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에서 가장 인기가 많기 때문에 여기에 게시합니다.


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

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


--테이블이 존재하는지 확인하는 절차 생성


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);

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

누군가 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

given that you have an object with the name in a property called item, and the schema in a property called schema where the source variable name is a


If this is to be the 'ultimate' discussion, then it should be noted that Larry Leonard's script can query a remote server as well if the servers are linked.

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

I've had some problems either with selecting from INFORMATIONAL_SCHEME and OBJECT_ID. I don't know if it's an issue of ODBC driver or something.. Queries from SQL management studio, both, were okay.

Here is the solution:

SELECT COUNT(*) FROM <yourTableNameHere>

So, if the query fails, there is, probably, no such table in the database (or you don't have access permissions to it).

The check is done by comparing the value (integer in my case) returned by SQL executor which deals with ODBC driver..

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

Run this query to check if the table exists in the database:

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

You can use bellow code

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

Or

IF (EXISTS (SELECT * FROM sys.tables WHERE NAME = 't33Order'))
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END

consider in one database you have a table t1. you want to run script on other Database like - if t1 exist then do nothing else create t1. To do this open visual studio and do the following:

Right click on t1, then Script table as, then DROP and Create To, then New Query Editor

you will find your desired query. But before executing that script don't forget to comment out the drop statement in the query as you don't want to create new one if there is already one.

Thanks

참고URL : https://stackoverflow.com/questions/167576/check-if-table-exists-in-sql-server

반응형