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_ID
INFORMATION_SCHEMA
1번으로 하다
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
'programing' 카테고리의 다른 글
를 저장하기 위한 올바른 SQL 유형은 무엇입니까?값이 24:00:00보다 큰 Net Timespan? (0) | 2023.04.07 |
---|---|
CASE 문을 JOIN 조건으로 사용할 수 있습니까? (0) | 2023.04.07 |
SQL Server 2005 데이터베이스에 대한 현재 연결을 모두 끊으려면 어떻게 해야 합니까? (0) | 2023.04.07 |
MS SQL Server와 연동되는 Mac OS X용 SQL 클라이언트 (0) | 2023.04.07 |
서버와의 접속은 정상적으로 확립되었지만 로그인 전 핸드쉐이크 중 오류가 발생하였습니다. (0) | 2023.04.07 |