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_SCHEMA
wrappers 와 동일한 작업을 수행합니다 .
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
'your programing' 카테고리의 다른 글
Python에서 확장자가 .txt 인 디렉토리의 모든 파일 찾기 (0) | 2020.09.27 |
---|---|
jQuery의 jquery-1.10.2.min.map이 404 (찾을 수 없음)를 트리거합니다. (0) | 2020.09.27 |
컨테이너 너비에 따른 글꼴 크기 조정 (0) | 2020.09.27 |
같은 브랜치에있는 두 개의 다른 커밋간에 같은 파일을 어떻게 비교합니까? (0) | 2020.09.27 |
AngularJS의 지시문 범위에서 '@'와 '='의 차이점은 무엇입니까? (0) | 2020.09.27 |