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)?


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:


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.


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

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


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.


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'

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;

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

22
SELECT name
FROM sys.columns
WHERE object_id = OBJECT_ID('TABLE_NAME')

TABLE_NAME adalah meja Anda


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

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')

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'

10

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

desc <TABLE NAME> ;

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]'

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

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 *.


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]'

1
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'name_of_your_table'

Jawaban lainnya sama.
Kiquenet

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

Sederhana dan tidak memerlukan tabel sys

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.