Як отримати список всіх таблиць у базі даних за допомогою TSQL?


895

Який найкращий спосіб отримати імена всіх таблиць у певній базі даних на SQL Server?




3
Чи працює SHOW TABLES(як використовується в MySQL)?
Мартін Тома

Відповіді:


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
Зверніть увагу, що сюди також будуть входити ПОЛОЖЕННЯ, не тільки таблиці
Натан Кооп

17
Додайте ім'я бази даних, якщо ви не використовуєте конкретну базу даних, щоб вона була ВИБІРТЕ
TABLE_NAME

22
Додавання WHERE TABLE_TYPE='BASE TABLE'включатиме лише базові таблиці (і за допомогою розширення, які ви завжди можете використовувати WHERE TABLE_TYPE != 'VIEW').
Філіп Коплі

3
У цьому списку також з’являється "sysdiagrams" :(
celsowm

4
sysdiagrams - це звичайна таблиця, її завжди потрібно виключати вручну за допомогою AND name <> 'sysdiagrams'.
Крістоф

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

Ось перелік інших типів об’єктів, які ви також можете шукати:

  • AF: Функція сукупності (CLR)
  • C: ПЕРЕВІРИТЕ обмеження
  • D: обмеження за замовчуванням або DEFAULT
  • F: обмеження закордонного ключа
  • Л: Журнал
  • FN: Скалярна функція
  • FS: Скалярна функція складання (CLR)
  • FT: функція, що оцінюється за допомогою таблиці (CLR)
  • ЯКЩО: Вбудована таблиця-функція
  • IT: Внутрішня таблиця
  • П: Збережена процедура
  • ПК: Збережена процедура (CLR)
  • ПК: обмеження первинного ключа (тип - K)
  • РФ: збережена процедура фільтра реплікації
  • S: Системна таблиця
  • СН: Синонім
  • SQ: Черга обслуговування
  • TA: тригер DML складання (CLR)
  • TF: Функція таблиці
  • TR: тригер SQL DML
  • TT: Тип таблиці
  • U: Таблиця користувачів
  • UQ: Унікальне обмеження (тип K)
  • V: Перегляд
  • X: Розширена збережена процедура

9
Псевдонім трохи зайвий: SELECT name FROM sysobjects WHERE xtype = 'U'зробив би те саме.
PJSCopeland

Дякую, спочатку я спробував це з декількома операторами вибору для PK,FK,D,C,V,UQтощо, щоб порівняти джерело та цільову базу даних, але потім я знайшов цю функцію в VS, але чи не sql queryможна порівняти повне джерело та цільову базу даних?
shaijut

Хочеться задатися питанням, чому 'U'використовується для ідентифікації Таблиці користувачів ... На відміну від, можливо, 'UT'або, найбільш інтуїтивної, 'T'... Ну, це працює!
user919426

87
SELECT * FROM INFORMATION_SCHEMA.TABLES 

АБО

SELECT * FROM Sys.Tables

5
Лише зауважте, що (як уже згадувалося в інших відповідях) sys.tables доступний лише в 2005 році
Роб

2
Що не є проблемою у 2018 році. Я думаю, що це повинно бути вище :-)
Michal B.




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'; тому що таблиця sysdiagrams, хоча створена Microsoft SQL Server Management Studio, технічно не є системною таблицею, а та, яку ми зазвичай любимо виключати.
Крістоф

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

Дякую Рею Вега, у відповіді якого представлені всі таблиці користувачів у базі даних ...

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.