programing

SQL Server에 테이블이 있는지 확인합니다.

bestprogram 2023. 4. 7. 22:03

SQL Server에 테이블이 있는지 확인합니다.

SQL Statements를 사용하여 SQL Server 2000/2005에 테이블이 존재하는지 확인하는 방법에 대한 궁극적인 토론이 되었으면 합니다.

여기 두 가지 가능한 방법이 있습니다.표준/최선의 방법은 무엇입니까?

첫 번째 방법:

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를 사용합니다.테이블 뷰

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: 시스템 사용개체 카탈로그 보기

시스템을 사용할 수 있습니다.오브젝트 카탈로그 뷰는 다음과 같이 테이블의 존재를 확인합니다.

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: 시스템 사용.테이블 카탈로그 보기

시스템을 사용할 수 있습니다.테이블 카탈로그 보기는 다음과 같이 테이블의 존재 여부를 확인합니다.

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

접근법 5: sys.sysobjects System 테이블 사용을 피합니다.

sys.sysobjects System Table을 직접 사용하는 것은 피해야 합니다.Sysobjects System Table에 대한 직접 액세스는 향후 일부 버전의 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/

다른 데이터베이스에서 테이블 검색:

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년에하지 않는 했습니다. 2016년에는 하지 않는 물체를 했습니다.if exists를 「」로 설정합니다.drop를 들어, 예,

drop table if exists mytablename

will OBJECT_IDINFORMATION_SCHEMA1번으로 하다

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 

Information Schema를 사용하는 것은 SQL Standard 방법이기 때문에 이 방법을 지원하는 모든 데이터베이스에서 사용해야 합니다.이 답변의 접근법 1을 참조하십시오.

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

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

코드에서 은 의의음음음음음음음 음음음 음음음음 음음음 here here here here here here here here here here here 。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이 존재하는 경우 schema.table을 포함할 수도 있고 포함하지 않을 수도 있습니다.또, 다음의 정보를 반환합니다.

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

테이블 또는 뷰가 존재하는지 여부를 테스트해야 할 때마다 이 스크립트를 다른 스크립트에서 사용하고, 존재했을 때 object_id를 다른 목적으로 사용하도록 만들었습니다.

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

예를 들어 -1을 반환할 수 있습니다.

예를 들어, 저는 "팩트"라는 표를 가지고 있습니다.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'
)

아직 솔루션을 찾지 못한 사용자가 알아야 할 중요한 사항: 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";

구글에서 최고 히트작이기 때문에 여기에 게시하는 것입니다.

INFORMATIONAL_SCHEME과 OBJECT_에서 선택하는 데 문제가 있었습니다.아이디. ODBC 드라이버 문제인지 뭔지 모르겠어요.SQL Management Studio에서 문의해도 문제없었습니다.

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

SELECT COUNT(*) FROM <yourTableNameHere>

따라서 쿼리가 실패하면 데이터베이스에 해당 테이블이 없을 수 있습니다(또는 쿼리에 대한 액세스 권한이 없습니다).

체크는 ODBC 드라이버를 처리하는 SQL 실행자가 반환한 값(이 경우 정수)을 비교하는 것으로 이루어집니다.

if (sqlexec(conectionHandle, 'SELECT COUNT(*) FROM myTable') == -1) {
  // myTable doesn't exist..
}
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

다음을 사용할 수 있습니다.

     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

다음 조회가 효과가 있다고 생각합니다.

IF EXISTS (select * from sys.tables 
WHERE name='mytablename' )
BEGIN
     print 'table exists in the database'
END
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

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

IF EXISTS(SELECT 1 FROM [change-to-your-database].SYS.TABLES WHERE NAME = 'change-to-your-table-name')
BEGIN
    -- do whatever you want
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

항목이라는 속성에 이름이 있는 개체가 있고 스키마라는 속성에 소스 변수 이름이 있는 스키마가 있는 경우a

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

이것이 '최종' 토론의 경우 서버가 링크되어 있는 경우에도 Larry Leonard 스크립트는 리모트서버를 쿼리할 수 있다는 점에 주의해 주십시오.

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

-- -- 테이블이 존재하는지 확인하는 절차를 만듭니다.


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

를 들어 뷰를 만듭니다.

ALTER/CREATE 명령은 BEGIN/END 블록 내에 있을 수 없기 때문입니다.Create를 수행하기 전에 존재와 드롭을 테스트해야 합니다.

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

다음 쿼리를 실행하여 데이터베이스에 테이블이 있는지 확인합니다.

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

하나의 데이터베이스에 테이블 t1이 있다고 가정합니다.t1이 존재하는 경우 t1을 작성하지 마십시오.이 비주얼 스튜디오를 열고 다음을 수행하려면:

t1을 우클릭한 후 스크립트 테이블을 다음으로 DROP 및 Create To, New Query Editor 순으로 클릭합니다.

원하는 쿼리를 찾을 수 있습니다.그러나 이 스크립트를 실행하기 전에 쿼리에서 드롭 스테이트먼트를 코멘트 아웃하는 것을 잊지 마십시오.이미 드롭 스테이트먼트가 있는 경우에는 새로 만들고 싶지 않습니다.

감사해요.

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