[sql] 테이블이 존재하고 존재하지 않는 경우 SQL Server 2008에서 테이블을 작성하십시오.

SQL Server 2008에서 저장 프로 시저를 작성하고 있습니다. 데이터베이스에 테이블이 있는지 확인해야합니다. 그렇지 않으면 만들어야합니다.

어떻게해야합니까?



답변

이 같은

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

BEGIN
CREATE TABLE [dbo].[YourTable](
    ....
    ....
    ....
) 

END


답변

대조적으로, 아래 표시된 것처럼 object_id 함수를 사용하는 것이 좋습니다. 좀 더 읽기 쉽고 sys.objects vs. sysobjects vs. sys.all_objects vs. sys.tables에 대해 걱정할 필요가 없습니다. 기본 형태 :

IF object_id('MyTable') is not null
    PRINT 'Present!'
ELSE
    PRINT 'Not accounted for'

이 경우 물론이 “현재”로 표시됩니다 어떤 그 이름을 가진 개체의 존재. 테이블 만 확인하려면 다음이 필요합니다.

IF object_id('MyTable', 'U') is not null
    PRINT 'Present!'
ELSE
    PRINT 'Not accounted for'

임시 테이블에서도 작동합니다.

IF object_id('tempdb.dbo.#MyTable') is not null
    PRINT 'Present!'
ELSE
    PRINT 'Not accounted for'


답변

아래 스크립트를 사용하여 테이블이있는 샘플 데이터베이스를 작성하십시오.

CREATE DATABASE Test
GO
USE Test
GO
CREATE TABLE dbo.tblTest (Id INT, Name NVARCHAR(50))

접근법 1 : INFORMATION_SCHEMA.TABLES 뷰 사용

아래와 같이 쿼리를 작성하여 현재 데이터베이스에 tblTest 테이블이 있는지 확인할 수 있습니다.

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

위 쿼리는 현재 데이터베이스의 모든 스키마에서 tblTest 테이블이 있는지 확인합니다. 대신 지정된 스키마와 지정된 데이터베이스에 테이블이 있는지 확인하려면 위와 같은 쿼리를 아래와 같이 작성할 수 있습니다.

IF EXISTS (SELECT * FROM Test.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = N'dbo'  AND TABLE_NAME = N'tblTest')
BEGIN
  PRINT 'Table Exists'
END

이 접근 방식의 장점 : INFORMATION_SCHEMA보기는 다른 RDBMS 시스템간에 이식 가능하므로 다른 RDBMS로 이식 할 때는 변경이 필요하지 않습니다.

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

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

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

테이블 이름에 데이터베이스 이름 및 스키마 이름 부분을 지정하는 것은 선택 사항입니다. 그러나 데이터베이스 이름 및 스키마 이름을 지정하면 모든 스키마에서 현재 데이터베이스를 체크인하는 대신 지정된 데이터베이스 및 지정된 스키마 내에 테이블이 있는지 확인하는 옵션이 제공됩니다. 아래 쿼리는 현재 데이터베이스가 MASTER 데이터베이스이지만 데이터베이스 tblTestdbo스키마에 테이블이 있는지 확인할 수 있음을 보여 줍니다 Test.

USE MASTER
GO
IF OBJECT_ID(N'Test.dbo.tblTest', N'U') IS NOT NULL
BEGIN
  PRINT 'Table Exists'
END

장점 : 기억하기 쉽습니다. OBJECT_ID()함수 에 관해 언급해야 할 또 하나의 주목할만한 점 은 현재 연결 컨텍스트에서 작성된 임시 테이블의 존재를 점검하는 옵션을 제공한다는 것입니다. 다른 모든 접근 방식은 현재 연결 컨텍스트 대신 모든 연결 컨텍스트에서 생성 된 임시 테이블이 있는지 확인합니다. 아래 쿼리는 OBJECT_ID()함수를 사용하여 임시 테이블의 존재를 확인하는 방법을 보여줍니다 .

CREATE TABLE #TempTable(ID INT)
GO
IF OBJECT_ID(N'TempDB.dbo.#TempTable', N'U') IS NOT NULL
BEGIN
  PRINT 'Table Exists'
END
GO

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

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

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

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

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

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

Sys.Tables카탈로그 뷰 상속의 행 Sys.Objects카탈로그 뷰는 Sys.objects카탈로그 뷰 같이 기준 뷰라고 sys.Tables볼 유도로 지칭된다. 테이블 객체에 대한 행을 반환하는 Sys.Tables반면 Sys.Object테이블 객체에 대한 행을 반환하는 것 외에도 뷰는 저장 프로 시저, 뷰 등과 같은 객체에 대한 행을 반환합니다.

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

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

IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'tblTest' 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/


답변

편집

존재하는 원하는 테이블을 확인하기 위해 sys.tables 를 살펴볼 수 있습니다 .

IF  NOT EXISTS (SELECT * FROM sys.tables
WHERE name = N'YourTable' AND type = 'U')

BEGIN
CREATE TABLE [SchemaName].[YourTable](
    ....
    ....
    ....
) 

END


답변

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE  TABLE_NAME = 'd020915'))
BEGIN
  declare @result int
  set @result=1
  select @result as result
END


답변

Declare @Username varchar(20)
Set @Username = 'Mike'

if not exists
(Select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'tblEmp')

Begin
    Create table tblEmp (ID int primary key, Name varchar(50))
    Print (@Username + ' Table created successfully')
End

Else

Begin
    Print (@Username + ' : this Table Already exists in the database')
End


답변

다음 명령문을 사용하여 데이터베이스에 테이블이 있는지 확인하십시오.

If not exists (select name from sysobjects where name = 'tablename')

if 블록 안에 테이블을 만들 수 있습니다.