ฉันจะรับรายการตารางทั้งหมดในฐานข้อมูลโดยใช้ 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
โปรดทราบว่านี่จะรวม VIEWS ไม่เพียง แต่ตาราง
นาธานคูป

17
เพิ่มชื่อฐานข้อมูลหากคุณไม่ได้ใช้ฐานข้อมูลเฉพาะดังนั้นจะเป็น SELECT TABLE_NAME จาก <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: ข้อ จำกัด การตรวจสอบ
  • D: ข้อ จำกัด ค่าเริ่มต้นหรือค่าเริ่มต้น
  • F: ข้อ จำกัด ของคีย์ต่างประเทศ
  • L: บันทึก
  • FN: ฟังก์ชันสเกลาร์
  • FS: ฟังก์ชันสเกลาร์ประกอบ (CLR)
  • FT: ฟังก์ชันที่มีค่าเป็นตาราง (Assembly (CLR))
  • หาก: ฟังก์ชันตารางฝังตัว
  • มัน: ตารางภายใน
  • P: ขั้นตอนการจัดเก็บ
  • PC: แอสเซมบลี (CLR) จัดเก็บกระบวนงาน
  • PK: ข้อ จำกัด คีย์หลัก (ประเภทคือ K)
  • RF: ตัวกรองการจำลองแบบกระบวนงานที่เก็บไว้
  • S: ตารางระบบ
  • SN: คำพ้อง
  • SQ: คิวบริการ
  • TA: ทริกเกอร์ DML Assembly (CLR)
  • TF: ฟังก์ชั่นตาราง
  • TR: ทริกเกอร์ DML ของ SQL
  • 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 เป็นต้นไป
Rob

2
ซึ่งไม่ใช่ปัญหาในปี 2561 ฉันคิดว่านี่น่าจะสูงกว่า :-)
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 นั้นไม่ใช่ทางเทคนิคในตารางระบบ แต่อย่างใดอย่างหนึ่งที่เรามักจะต้องการยกเว้นอยู่แล้ว
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

ขอบคุณ Ray Vega ที่คำตอบให้ตารางผู้ใช้ทั้งหมดในฐานข้อมูล ...

exec sp_msforeachtable 'พิมพ์' '?' ''

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.