ฉันจะรับชื่อคอลัมน์จากตารางใน SQL Server ได้อย่างไร


715

ฉันต้องการสอบถามชื่อของคอลัมน์ทั้งหมดของตาราง ฉันพบวิธีการทำสิ่งนี้ใน:

แต่ฉันจำเป็นต้องรู้: สิ่งนี้สามารถทำได้ในMicrosoft SQL Server (2008 ในกรณีของฉัน)?


48
เป็นเคล็ดลับที่รวดเร็วและสกปรกฉันชอบทำจริงๆSELECT * FROM my_table WHERE 1=0
bgusach

12
@bgusach - ดูเหมือนว่าผู้ใช้ต้องการชื่อคอลัมน์เป็นแถวในตาราง แต่สำหรับสิ่งที่คุณพยายามจะทำSELECT TOP 0 * FROM my_tableคือกดแป้นน้อย
Jake Wood

@ bgusach: ฟังดูเหมือนคำตอบสำหรับฉัน คุณควรโพสต์มัน
palswim

คำตอบ:


863

คุณสามารถได้รับข้อมูลนี้และอื่น ๆ อีกมากโดยสอบถามมุมมองข้อมูล Schema

แบบสอบถามตัวอย่างนี้:

SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'Customers'

สามารถทำเหนือวัตถุฐานข้อมูลเหล่านี้ทั้งหมด:


25
"N" ใน "= N'Customers '" หมายถึงอะไร
Qbik

20
Qbik "N" ถ้า handlling สตริงยูนิโค้ดเช่น varchar ใน ANSI (32 บิต) และ nvarchar ใน unicode (64 บิต)
thatsalok

9
ยืนยัน: ใช้งานได้กับMariaDBด้วย! :) (โดยไม่ต้องNortwind.... )
jave.web

5
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'tableName';สิ่งนี้ใช้ได้กับฉัน
Pavol Travnik

1
ฉันต้องใช้TABLE_SCHEMA = '?' AND TABLE_NAME = '?'ตั้งแต่ฉันอยู่ใน localhost และฉันมีหลายตารางที่มีชื่อเดียวกัน แต่ในฐานข้อมูลที่แตกต่างกัน
akinuri

194

คุณสามารถใช้กระบวนงานที่เก็บไว้ sp_columns ซึ่งจะส่งคืนข้อมูลที่เกี่ยวข้องกับคอลัมน์ทั้งหมดสำหรับตารางที่กำหนด ข้อมูลเพิ่มเติมสามารถดูได้ที่นี่http://msdn.microsoft.com/en-us/library/ms176077.aspx

คุณยังสามารถทำได้โดยแบบสอบถาม SQL สิ่งนี้จะช่วยได้:

SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('dbo.yourTableName') 

หรือรูปแบบจะเป็น:

SELECT   o.Name, c.Name
FROM     sys.columns c 
         JOIN sys.objects o ON o.object_id = c.object_id 
WHERE    o.type = 'U' 
ORDER BY o.Name, c.Name

สิ่งนี้จะได้รับคอลัมน์ทั้งหมดจากตารางทั้งหมดเรียงลำดับตามชื่อตารางและจากนั้นในชื่อคอลัมน์


148
select *
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='tableName'

สิ่งนี้ดีกว่าการมาจากsys.columnsเพราะมันแสดงDATA_TYPEโดยตรง


5
+1 เนื่องจากนี่คือมาตรฐาน ANSI SQL ( en.wikipedia.org/wiki/Information_schema ) คำตอบอื่น ๆ เช่น sys.objects นั้นไม่ได้มาตรฐาน
Reversed Engineer

และถ้าตารางอยู่ใน schema อื่น (ตัวแปร SQL "" schema "ของเซิร์ฟเวอร์ SQL) จะเพิ่มAND TABLE_SCHEMA = 'schemaName'เข้าไปในWHEREclause
Johan

มีประโยชน์มากและคุณสามารถเพิ่มJOIN sys.types t on c.system_type_id = t.system_type_idและเพิ่มt.nameคำสั่ง 'SELECT' ของคุณเพื่อรับชนิดถัดจากชื่อคอลัมน์แต่ละชื่อได้เช่นกัน
Pac0

56

คุณสามารถใช้sp_helpใน SQL Server 2008

sp_help <table_name>;

แป้นพิมพ์ลัดสำหรับคำสั่งดังกล่าวข้างต้น: เลือกชื่อตาราง (เช่นไฮไลต์) และกด+ALTF1


1
นี่คือแป้นพิมพ์ลัดสุดโปรดของฉันตลอดเวลา ฉันยังกำหนด sp_helptext ให้กับ Cntl-F1 ทางลัดทั้งสองนี้ร่วมกันช่วยประหยัดเวลาได้มาก!
Paul Wehland

44

เมื่อใช้แบบสอบถามนี้คุณจะได้รับคำตอบ:

select Column_name 
from Information_schema.columns 
where Table_name like 'table name'

35

คุณสามารถเขียนแบบสอบถามนี้เพื่อรับชื่อคอลัมน์และรายละเอียดทั้งหมดโดยไม่ต้องใช้ INFORMATION_SCHEMA ใน MySql:

SHOW COLUMNS FROM database_Name.table_name;

7
@Benjamin เพราะคำถามนี้มีไว้สำหรับ SQL Server และคำตอบนี้สำหรับ MySql
Caimen

1
อาจเป็นคนส่วนใหญ่ที่ใช้ MySql เผชิญกับปัญหานี้ และฉันได้กล่าวถึงมัน ฉันใช้ MySql
Sachin Parse

5
ไม่สำคัญว่าคนส่วนใหญ่ที่ใช้ RDBMS รายอื่นมีปัญหาเดียวกัน แต่ไม่เกี่ยวข้องกับคำถามดั้งเดิมและผลักดันคำตอบที่เกี่ยวข้องให้มากขึ้น
Demonblack

1
ฉันลงคะแนนเพราะคำถามนี้ตอบเฉพาะกับ mssql
ลูคัส

27
--This is another variation used to document a large database for conversion (Edited to --remove static columns)

SELECT o.Name                   as Table_Name
     , c.Name                   as Field_Name
     , t.Name                   as Data_Type
     , t.length                 as Length_Size
     , t.prec                   as Precision_
FROM syscolumns c 
     INNER JOIN sysobjects o ON o.id = c.id
     LEFT JOIN  systypes t on t.xtype = c.xtype  
WHERE o.type = 'U' 
ORDER BY o.Name, c.Name

--In the left join, c.type is replaced by c.xtype to get varchar types


15
SELECT column_name, data_type, character_maximum_length, table_name,ordinal_position, is_nullable 
FROM information_schema.COLUMNS WHERE table_name LIKE 'YOUR_TABLE_NAME'
ORDER BY ordinal_position


11

คำถาม SO นี้ไม่มีวิธีการต่อไปนี้:

-- List down all columns of table 'Logging'
select * from sys.all_columns where object_id = OBJECT_ID('Logging')

10

มันจะตรวจสอบว่าได้รับtableเป็นตารางฐาน

SELECT 
    T.TABLE_NAME AS 'TABLE NAME',
    C.COLUMN_NAME AS 'COLUMN NAME'
FROM INFORMATION_SCHEMA.TABLES T
INNER JOIN INFORMATION_SCHEMA.COLUMNS C ON T.TABLE_NAME=C.TABLE_NAME
    WHERE   T.TABLE_TYPE='BASE TABLE'
            AND T.TABLE_NAME LIKE 'Your Table Name'

10

คุณสามารถลองสิ่งนี้ได้ซึ่งจะให้ชื่อคอลัมน์ทั้งหมดด้วยประเภทข้อมูลที่เกี่ยวข้อง

desc <TABLE NAME> ;

ฉันรู้ว่างานนี้ใน Oracle แต่สิ่งนี้ทำงานใน Microsft SQL หรือไม่ ขอบคุณ.
DxTx

6

คุณสามารถใช้แบบสอบถามนี้

SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME like N'%[ColumnName]%' and TABLE_NAME = N'[TableName]'


5

อีกตัวเลือกหนึ่งซึ่งมีเนื้อหาที่เข้าใจง่ายกว่าคือ:

SELECT [name] 
FROM sys.columns 
WHERE object_id = OBJECT_ID('[yourSchemaType].[yourTableName]') 

สิ่งนี้จะให้ชื่อคอลัมน์ทั้งหมดของคุณในคอลัมน์เดียว หากคุณสนใจเกี่ยวกับเมตาดาต้าอื่น ๆ SELECT *ที่คุณสามารถเปลี่ยนแปลงแก้ไขคำสั่ง


3

สรุปคำตอบ

ฉันสามารถดูคำตอบที่แตกต่างและวิธีการที่จะทำเช่นนี้ objectiveแต่มีถูในนี้และที่เป็น

ใช่วัตถุประสงค์ หากคุณต้องการonly knowชื่อคอลัมน์คุณสามารถใช้

SELECT * FROM my_table WHERE 1=0
or
SELECT TOP 0 * FROM my_table

แต่ถ้าคุณต้องการuseคอลัมน์เหล่านั้นที่ใดที่หนึ่งหรือเพียงแค่พูดว่าmanipulateพวกเขาแล้วการสืบค้นด่วนข้างต้นจะไม่เป็นการใช้งานใด ๆ คุณต้องใช้

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'Customers'

อีกวิธีหนึ่งในการรู้คอลัมน์เฉพาะที่เราต้องการบางคอลัมน์ที่คล้ายกัน

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME like N'%[ColumnName]%' and TABLE_NAME = N'[TableName]'


0
SELECT TOP (0) [toID]
      ,[sourceID]
      ,[name]
      ,[address]
  FROM [ReportDatabase].[Ticket].[To]

ง่ายและไม่จำเป็นต้องมีตารางใด ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.