문제

나는 다음과 같이 될 것을 궁극적인 토론 방법을 확인하는 경우에는 테이블에 존재하는 SQL Server2000/2005 를 사용하여 SQL 문을 수행합니다.

할 때 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 view 사용

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

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

접근 2 : Object_id () 함수를 사용합니다

아래와 같이 Object_id () 함수를 사용하여 현재 데이터베이스에 고객 테이블이 있는지 확인할 수 있습니다.

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 : sysobjects 시스템 테이블 사용을 피하십시오

SysObjects 시스템 테이블을 직접 사용하지 않아야합니다. 향후 SQL 서버의 일부 버전에서 직접 액세스 할 수 있습니다. Microsoft Bol Link에 따라 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-enists-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 Edit:

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

drop table if exists mytablename

같은 일을 할 것입니다 OBJECT_ID / INFORMATION_SCHEMA 1 줄의 코드로 포장지.

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 표준 방법이므로 지원하는 모든 데이터베이스에서 사용해야합니다.

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

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

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

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

테이블이나 뷰가 존재하는지 여부를 테스트해야 할 때마다 다른 스크립트 내부에서 사용되는이 스크립트를 제작했습니다.

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

이것은 절차 내부에있을 수 있으며 예를 들어 -1을 반환 할 수 있습니다.

예를 들어, 데이터웨어 하우스 데이터베이스 중 하나에 "facts.fackbackorder"라는 테이블이 있습니다.

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

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에서 최고 히트이기 때문에 여기에 게시합니다.

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   dbo.sysobjects WHERE  id = OBJECT_ID(N'dbo.TableName') AND OBJECTPROPERTY(id, N'IsUserTable') = 1 )
BEGIN
  SELECT * FROM dbo.TableName;
END
GO

누군가가 LINQ에서 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

는 경우 이은 것을 궁극적인'토론,다음은 주목해야한다는 래리는 레너드의 스크립트를 쿼리할 수 있습니다 원격 서버뿐만 아니라면 서버는 연결되어 있습니다.

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

Informational_Scheme 및 Object_id에서 선택하는 데 몇 가지 문제가있었습니다. 나는 그것이 ODBC 드라이버의 문제인지 여부를 모른다.

다음은 해결책입니다.

SELECT COUNT(*) FROM <yourTableNameHere>

따라서 쿼리가 실패하면 데이터베이스에 그러한 테이블이 없거나 액세스 권한이 없음).

수표는 ODBC 드라이버를 다루는 SQL Executor가 반환 한 값 (내 경우 정수)을 비교하여 이루어집니다.

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

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

IF(SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'YourTableName') IS NOT NULL
PRINT 'Table Exists';
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

하나의 데이터베이스에서 표 T1이있는 것을 고려하십시오. 다른 데이터베이스에서 스크립트를 실행하려고합니다. T1이 존재하면 다른 작업을 수행하지 않으면 T1을 만들지 않습니다. 이 열린 비주얼 스튜디오를 수행하고 다음을 수행하려면 다음을 수행하십시오.

T1을 마우스 오른쪽 버튼으로 클릭 한 다음 스크립트 테이블로 스크립트 테이블을 삭제하고 작성한 다음 새 쿼리 편집기

원하는 쿼리를 찾을 수 있습니다. 그러나 해당 스크립트를 실행하기 전에 이미 하나가 있다면 새 제품을 만들고 싶지 않기 때문에 쿼리의 Drop 문을 댓글을 달아주는 것을 잊지 마십시오.

감사

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top