Bagaimana saya bisa mendapatkan nama kolom dari tabel di SQL Server?

715

Saya ingin menanyakan nama semua kolom tabel. Saya menemukan cara melakukan ini di:

Tapi saya perlu tahu: bagaimana ini bisa dilakukan di Microsoft SQL Server (2008 dalam kasus saya)?

odiseh
sumber
48
Sebagai trik cepat & kotor, saya sangat suka melakukannyaSELECT * FROM my_table WHERE 1=0
bgusach
12
@ bgusach - Sepertinya pengguna menginginkan nama kolom sebagai baris dalam sebuah tabel, tetapi untuk apa yang Anda coba lakukan, SELECT TOP 0 * FROM my_tablekurang menekan tombol
Jake Wood
@ bgusach: Kedengarannya seperti jawaban untuk saya. Anda harus mempostingnya.
palswim

Jawaban:

863

Anda dapat memperoleh informasi ini dan banyak lagi, lebih banyak lagi dengan menanyakan tampilan Skema Informasi .

Kueri sampel ini:

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

Dapat dibuat di atas semua objek DB ini:

Luke Burns
sumber
25
apa arti "N" dalam "= N'Customers '"?
Qbik
20
Qbik "N" jika untuk handlling string unicode seperti varchar di ANSI (32bit) dan nvarchar di unicode (64bit)
thatsalok
9
dikonfirmasi: berfungsi untuk MariaDB juga! :) (tanpa Nortwind....)
jave.web
5
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'tableName';ini bekerja untuk saya
Pavol Travnik
1
Saya harus menggunakan TABLE_SCHEMA = '?' AND TABLE_NAME = '?'karena saya di localhost dan saya punya beberapa tabel dengan nama yang sama tetapi dalam database yang berbeda.
akinuri
194

Anda dapat menggunakan prosedur tersimpan sp_columns yang akan mengembalikan informasi yang berkaitan dengan semua kolom untuk tabel yang diberikan. Info lebih lanjut dapat ditemukan di sini http://msdn.microsoft.com/en-us/library/ms176077.aspx

Anda juga dapat melakukannya dengan kueri SQL. Beberapa hal seperti ini akan membantu:

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

Atau variasi akan menjadi:

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

Ini mendapatkan semua kolom dari semua tabel, diurutkan berdasarkan nama tabel dan kemudian pada nama kolom.

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

Ini lebih baik daripada mendapatkan dari sys.columnskarena itu menunjukkan DATA_TYPEsecara langsung.

Limin
sumber
5
Memberi +1 karena ini adalah ANSI SQL standar ( en.wikipedia.org/wiki/Information_schema ) Jawaban lain seperti sys.objects tidak standar
Reversed Engineer
Dan jika tabel dalam skema lain (varian "skema" SQL server) tambahkan AND TABLE_SCHEMA = 'schemaName'dalam WHEREklausa.
Johan
Sangat berguna, dan Anda dapat menambahkan JOIN sys.types t on c.system_type_id = t.system_type_iddan menambahkan t.namepernyataan 'SELECT' untuk mendapatkan jenis di sebelah setiap nama kolom juga.
Pac0
56

Anda bisa menggunakan sp_helpSQL Server 2008.

sp_help <table_name>;

Pintasan keyboard untuk perintah di atas: pilih nama tabel (mis. Sorot) dan tekan ALT+ F1.

mr_eclair
sumber
1
ini adalah jalan pintas keyboard favorit saya sepanjang waktu. Saya juga menetapkan sp_helptext ke Cntl-F1. Bersama dua pintasan ini menghemat banyak waktu!
Paul Wehland
44

Dengan menggunakan kueri ini, Anda mendapatkan jawabannya:

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

Anda dapat menulis kueri ini untuk mendapatkan nama kolom dan semua detail tanpa menggunakan INFORMATION_SCHEMA di MySql:

SHOW COLUMNS FROM database_Name.table_name;
Sachin Parse
sumber
7
@ Benjamin, karena pertanyaan ini untuk SQL Server dan jawaban ini untuk MySql
Caimen
1
Mungkin sebagian besar orang menggunakan MySql, menghadapi masalah ini. Dan saya telah menyebutkannya. Saya menggunakan MySql.
Sachin Parse
5
Tidak masalah jika sebagian besar orang yang menggunakan RDBMS lain memiliki masalah yang sama, itu tidak relevan dengan pertanyaan awal dan mendorong jawaban yang relevan lebih jauh ke bawah.
Demonblack
1
Saya mengundurkan diri karena pertanyaannya secara khusus ditujukan kepada mssql
Lucas
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
Dokter
sumber
22
SELECT name
FROM sys.columns
WHERE object_id = OBJECT_ID('TABLE_NAME')

TABLE_NAME adalah meja Anda

bstricks
sumber
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
Petko Petkov
sumber
12

Jalankan saja perintah ini

EXEC sp_columns 'Your Table Name'
Hardeep Singh
sumber
2
itu tidak memberikan hasil yang diinginkan
Amit chauhan
11

Pertanyaan SO ini tidak memiliki pendekatan berikut:

-- List down all columns of table 'Logging'
select * from sys.all_columns where object_id = OBJECT_ID('Logging')
Tidak ada yang hilang
sumber
10

Ini akan memeriksa apakah yang diberikan tableadalah Base 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'
Luv
sumber
10

Anda dapat mencoba ini. Ini memberikan semua nama kolom dengan tipe data masing-masing.

desc <TABLE NAME> ;
ishaan arora
sumber
Saya tahu ini berfungsi di Oracle. Tetapi apakah ini bekerja di Microsft SQL? Terima kasih.
DxTx
6

Anda dapat menggunakan kueri ini

SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME like N'%[ColumnName]%' and TABLE_NAME = N'[TableName]'
reza akhlaghi
sumber
6
SELECT c.Name 
FROM sys.columns c
JOIN sys.objects o ON o.object_id = c.object_id
WHERE o.object_id = OBJECT_ID('TABLE_NAME')
ORDER BY c.Name
Mohamed Raguig Labzour
sumber
5

Satu opsi lain yang bisa dibilang lebih intuitif adalah:

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

Ini memberi Anda semua nama kolom Anda dalam satu kolom. Jika Anda peduli dengan metadata lain, Anda dapat mengubah sunting PERNYATAAN SELECT menjadi SELECT *.

Samuel Nde
sumber
3

Meringkas Jawaban

Saya dapat melihat berbagai jawaban dan cara untuk melakukan ini tetapi ada intinya dalam hal ini dan itu adalah objective.

Ya, tujuannya. Jika Anda ingin only knownama kolom yang dapat Anda gunakan

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

Tetapi jika Anda ingin usekolom tersebut di suatu tempat atau hanya mengatakannya manipulatemaka pertanyaan cepat di atas tidak akan berguna. Anda harus menggunakan

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

satu lagi cara untuk mengetahui beberapa kolom tertentu di mana kita membutuhkan beberapa kolom serupa

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME like N'%[ColumnName]%' and TABLE_NAME = N'[TableName]'
Shreekant
sumber
1
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'name_of_your_table'
onavascuez
sumber
Jawaban lainnya sama.
Kiquenet
0
SELECT TOP (0) [toID]
      ,[sourceID]
      ,[name]
      ,[address]
  FROM [ReportDatabase].[Ticket].[To]

Sederhana dan tidak memerlukan tabel sys

Hawkzey
sumber