TSQL을 사용하여 데이터베이스의 모든 테이블 목록을 어떻게 얻습니까?


895

SQL Server의 특정 데이터베이스에있는 모든 테이블의 이름을 얻는 가장 좋은 방법은 무엇입니까?




3
합니까 SHOW TABLES작업 (MySQL의에서 사용)?
— Martin Thoma

답변:


1429

SQL Server 2000, 2005, 2008, 2012, 2014, 2016, 2017 또는 2019 :

SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'

특정 데이터베이스의 테이블 만 표시하려면

SELECT TABLE_NAME 
FROM <DATABASE_NAME>.INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE = 'BASE TABLE'

또는,

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE = 'BASE TABLE' 
    AND TABLE_CATALOG='dbName' --(for MySql, use: TABLE_SCHEMA='dbName' )

PS : SQL Server 2000의 경우 :

SELECT * FROM sysobjects WHERE xtype='U' 

46
여기에는 테이블뿐만 아니라 뷰도 포함됩니다.
— Nathan Koop

17
특정 데이터베이스를 사용하지 않는 경우 데이터베이스 이름을 추가하여 <DATABASE_NAME>에서 SELECT TABLE_NAME FROM <DATABASE_NAME>이되도록하십시오. INFORMATION_SCHEMA.Tables
— Shriroop

22
추가 WHERE TABLE_TYPE='BASE TABLE'하면 기본 테이블 만 포함되며 확장을 통해 항상 사용할 수 있습니다 WHERE TABLE_TYPE != 'VIEW'.
— Phillip Copley

3
"sysdiagrams는":(도이 목록에 나타납니다
— celsowm

4
sysdiagrams는 일반 테이블이므로 항상로 수동으로 제외해야합니다 AND name <> 'sysdiagrams'.
— Christoph

199
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'U'

검색 할 수있는 다른 객체 유형 목록은 다음과 같습니다.

  • AF : 집계 기능 (CLR)
  • C : CHECK 제약
  • D : 디폴트 또는 DEFAULT 제약
  • F : 외래 키 제약
  • L : 로그
  • FN : 스칼라 함수
  • FS : 어셈블리 (CLR) 스칼라 함수
  • FT : 어셈블리 (CLR) 테이블 반환 함수
  • IF : 인라인 테이블 함수
  • IT : 내부 테이블
  • P : 저장 프로 시저
  • PC : 조립 (CLR) 저장 프로 시저
  • PK : PRIMARY KEY 제약 조건 (유형은 K)
  • RF : 복제 필터 저장 프로 시저
  • S : 시스템 테이블
  • SN : 동의어
  • SQ : 서비스 대기열
  • TA : 어셈블리 (CLR) DML 트리거
  • TF : 테이블 함수
  • TR : SQL DML 트리거
  • TT : 테이블 유형
  • U : 사용자 테이블
  • UQ : UNIQUE 제약 조건 (유형은 K)
  • V :보기
  • X : 확장 저장 프로 시저

9
앨리어싱은 약간 중복됩니다. SELECT name FROM sysobjects WHERE xtype = 'U'동일한 작업을 수행합니다.
— PJSCopeland 2016 년

감사합니다. 처음에 PK,FK,D,C,V,UQ소스와 대상 데이터베이스를 비교 하기 위해 etc에 대한 여러 select 문으로 이것을 시도했지만 VS 에서이 기능을 찾았 지만 sql query완전한 소스와 대상 데이터베이스를 비교할 수는 없습니까?
— shaijut

'U'아마도 사용자 테이블을 식별하는 데 왜 사용 되는지 궁금해 할 것입니다 ... 어쩌면 'UT'또는 가장 직관적 인 것과는 대조적으로 'T'... 아, 잘 작동합니다!
— user919426

87
SELECT * FROM INFORMATION_SCHEMA.TABLES 

또는

SELECT * FROM Sys.Tables

5
(다른 답변에서 언급했듯이) sys.tables는 2005 년 이후에만 사용 가능합니다
— Rob

2
나는 이것이 더 높아야한다고 생각합니다 :-)
— Michal B.

29
USE YourDBName
GO 
SELECT *
FROM sys.Tables
GO

또는

USE YourDBName
GO
SELECT * FROM INFORMATION_SCHEMA.TABLES 
GO



9
SELECT name 
FROM sysobjects 
WHERE xtype='U' 
ORDER BY name;

(SQL Server 2000 표준. 여전히 SQL Server 2005에서 지원됩니다.)



6
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'U' 

SELECT name FROM sysobjects WHERE xtype='U' AND name <> 'sysdiagrams'; 왜냐하면 Microsoft SQL Server Management Studio에 의해 생성되었지만 sysdiagrams 테이블은 기술적으로 시스템 테이블이 아니라 일반적으로 제외하려는 테이블이기 때문입니다.
— Christoph

5

단점은 INFORMATION_SCHEMA.TABLES테이블과 같은 시스템 테이블도 포함하고 dtproperties있으며, MSpeer_...테이블과 구별 할 수있는 방법이 없다는 것입니다.

시스템 테이블 제외를 지원 sys.objects하는 (더 이상 사용되지 않는 sysobjects 뷰 의 새 버전)을 사용 하는 것이 좋습니다 .

select *
from sys.objects
where type = 'U'      -- User tables
and is_ms_shipped = 0 -- Exclude system tables

2

SSMS에서 특정 데이터베이스의 모든 정규화 된 테이블 이름을 가져 오려면 (예 : "MyDatabase") :

SELECT [TABLE_CATALOG] + '.' + [TABLE_SCHEMA] + '.' + [TABLE_NAME]
FROM   MyDatabase.INFORMATION_SCHEMA.Tables
WHERE  [TABLE_TYPE] = 'BASE TABLE' and [TABLE_NAME] <> 'sysdiagrams'
ORDER BY [TABLE_SCHEMA], [TABLE_NAME]

결과 :

  • MyDatabase.dbo.MyTable1
  • MyDatabase.dbo.MyTable2
  • MyDatabase.MySchema.MyTable3
  • MyDatabase.MySchema.MyTable4
  • 기타

2

이것을 사용하십시오. 스키마 이름과 함께 테이블 이름을 얻게됩니다.

SELECT SYSSCHEMA.NAME, SYSTABLE.NAME
FROM SYS.tables SYSTABLE
INNER JOIN SYS.SCHEMAS SYSSCHEMA
ON SYSTABLE.SCHEMA_ID = SYSSCHEMA.SCHEMA_ID

1
SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE='BASE TABLE' 
ORDER BY TABLE_NAME

1

응답이 데이터베이스의 모든 사용자 테이블을 제공하는 Ray Vega 덕분에 ...

exec sp_msforeachtable 'print' '?' ''

sp_helptext는 다음과 같은 기본 쿼리를 보여줍니다.

select * from dbo.sysobjects o 
join sys.all_objects syso on o.id =  syso.object_id  
where OBJECTPROPERTY(o.id, 'IsUserTable') = 1 
and o.category & 2 = 0 

1

sys.objects 를 사용 하여 모든 데이터베이스 객체를 얻을 수 있습니다 .

 GO
 select * from sys.objects where type_desc='USER_TABLE' order by name
 GO

또는

--  For all tables
select * from INFORMATION_SCHEMA.TABLES 
GO 

  --- For user defined tables
select * from INFORMATION_SCHEMA.TABLES where TABLE_TYPE='BASE TABLE'
GO

  --- For Views
select * from INFORMATION_SCHEMA.TABLES where TABLE_TYPE='VIEW'
GO

0
--for oracle
select tablespace_name, table_name from all_tables;

이 링크는이 주제 에 대한 더 많은 정보를 제공 할 수 있습니다


2
이것은 SQL Server 용이 아니므로이 질문에 대한 답변이 아닙니다.
— Dan Getz

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.