Як отримати список всіх таблиць у базі даних за допомогою 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.