Bagaimana Anda mengembalikan nama kolom dari sebuah tabel?


239

Bagaimana saya mengembalikan nama kolom tabel menggunakan SQL Server 2008? yaitu tabel yang berisi kolom-id ini, nama, alamat, negara dan saya ingin mengembalikan ini sebagai data.

Jawaban:


400

Tidak yakin apakah ada cara yang lebih mudah di versi 2008.

USE [Database Name]
SELECT COLUMN_NAME,* 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTableName' AND TABLE_SCHEMA='YourSchemaName'

6
Apakah 'YourSchemaName' itu?
Drewdin

12
'YourSchemaName' adalah skema untuk tabel yang Anda tanyakan. Contoh: dbo.myTable, 'dbo' adalah skema milik 'myTable'. Skema membuatnya lebih mudah untuk menetapkan izin untuk pengelompokan daripada setiap tabel secara individual. Lihat pertanyaan ini juga: stackoverflow.com/questions/1062075/…
jmosesman

3
Jangan lupa pada perintah USE DatabaseName jika tidak, Anda dapat mencari di master atau database yang berbeda dari yang Anda inginkan
Muflix

1
SELECT COLUMN_NAME, * DARI INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'YourTableName' AND TABLE_SCHEMA = 'dbo'
Usman Younas

112

Ini cara termudah

exec sp_columns [tablename]

2
Ini singkat dan sederhana, harus menjadi jawaban yang benar. Saya membayangkan itu tidak ada ketika pertanyaan awalnya diajukan :)
DanteTheSmith

1
Jika skema Anda bukan dbo, Anda harus meneruskannya sebagai parameter tambahan. exec sp_columns [TableName], @table_owner = [skema]
Pradeep


13

Salah satu metode adalah dengan menanyakan syscolumns:

select
   syscolumns.name as [Column],
   syscolumns.xusertype as [Type],
   sysobjects.xtype as [Objtype]
from 
   sysobjects 
inner join 
   syscolumns on sysobjects.id = syscolumns.id
where sysobjects.xtype = 'u'
and   sysobjects.name = 'MyTableName'
order by syscolumns.name

1
Saya sangat suka yang ini. Saya menemukan Objtypekolom yang redundan :)
Joel

1
Bukankah lebih baik untuk sepenuhnya menulis bergabung (sysobjects jadi batin gabung syscolumns sc pada so.id = sc.id)? Ini sepertinya jawaban malas dengan mengorbankan kinerja. Saya bisa saja salah ...
Losbear

1
@Losbear mengubahnya PS: Tidak malas, hanya kode dari 8 tahun yang lalu. :) Di masa lalu (saya menggunakan SQL Server mulai dari versi 4.2), saya biasa menulis query SQL dengan cara ini. tidak ada masalah kinerja.
splattne

9

Ini tampaknya sedikit lebih mudah daripada saran di atas karena menggunakan fungsi OBJECT_ID () untuk menemukan id tabel. Setiap kolom dengan id itu adalah bagian dari tabel.

SELECT * 
  FROM syscolumns 
 WHERE id=OBJECT_ID('YOUR_TABLE') 

Saya biasanya menggunakan kueri yang sama untuk melihat apakah kolom yang saya tahu adalah bagian dari versi yang lebih baru. Ini adalah permintaan yang sama dengan penambahan {AND name = 'YOUR_COLUMN'} ke klausa where.

IF EXISTS (
        SELECT * 
          FROM syscolumns 
         WHERE id=OBJECT_ID('YOUR_TABLE') 
           AND name='YOUR_COLUMN'
        )
BEGIN
    PRINT 'Column found'
END

8

coba ini

select * from <tablename> where 1=2

...............................................


Menarik, tetapi apa logika di baliknya?
nilakantha singh deo

@nilakanthasinghdeo, logikanya adalah bahwa ia akan selalu mengembalikan nol baris dengan WHERE 1=2dan itu masih akan mengembalikan meta-data kolom. Jika menggunakan antarmuka terprogram seperti ODBC, maka info kolom ini dapat diakses sebagai daftar / larik dari objek kursor dalam program, yang adalah apa yang saya cari. Mungkin tidak masuk akal dalam konteks SQL murni, tetapi merupakan pendekatan ringkas saat menghubungkan ke database melalui Python / Java / C / dll.
Arthur Hebert

5

Berikut ini tampaknya seperti kueri yang disarankan pertama di atas tetapi kadang-kadang Anda harus menentukan database untuk membuatnya berfungsi. Perhatikan bahwa kueri juga harus berfungsi tanpa menentukan TABLE_SCHEMA:

SELECT COLUMN_NAME
FROM   YOUR_DB_NAME.INFORMATION_SCHEMA.COLUMNS
WHERE  TABLE_NAME = 'YOUR_TABLE_NAME' AND TABLE_SCHEMA = 'YOUR_DB_NAME'

4

saya menggunakan

SELECT st.NAME, sc.NAME, sc.system_type_id
FROM sys.tables st
INNER JOIN sys.columns sc ON st.object_id = sc.object_id
WHERE st.name LIKE '%Tablename%'

3

Mengapa tidak coba saja ini:

klik kanan pada tabel -> Script Table As -> Create To -> New Query Editor Window?

Seluruh daftar kolom diberikan dalam skrip. Salin dan gunakan bidang yang diperlukan.


3
Penulis kemungkinan ingin tahu cara mendapatkan nama kolom dari tabel secara terprogram untuk digunakan dalam prosedur tersimpan atau skrip lainnya.
KLee1

1
Jawabannya menyatakan "I want to return these as data", sementara jawaban Anda akan mendapatkan nilai, kemungkinan OP menginginkan data saat runtime.
StuperUser

2

USE[Database] SELECT TABLE_NAME,TABLE_SCHEMA,[Column_Name],[Data_type] FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='dbo'


1
CREATE PROCEDURE [dbo].[Usp_GetColumnName]      
        @TableName varchar(50)
AS
BEGIN   
    BEGIN
        SET NOCOUNT ON
        IF (@TableName IS NOT NULL) 
            select ORDINAL_POSITION OrderPosition,COLUMN_NAME ColumnName from information_schema.columns 
             where table_name =@TableName
             order by ORDINAL_POSITION
    END
END

2
Selamat datang di SO! Tapi sepertinya pertanyaan ini sudah mendapatkan jawaban yang memuaskan sekitar tiga tahun yang lalu ... Juga, saat memposting kode, gunakan {} untuk menyorotnya. Lihat FAQ, ada info bagus untuk memulai di sini: stackoverflow.com/faq
Valentino Vranken

1

Saya tidak yakin apakah nilai syscolumns.colid sama dengan nilai 'ORDINAL_POSITION' yang dikembalikan sebagai bagian dari sp_columns, tetapi dalam hal berikut saya menggunakannya dengan cara itu - harap saya tidak salah informasi ...

Berikut sedikit variasi pada beberapa jawaban lain yang saya temukan - saya menggunakan ini karena 'posisi' atau urutan kolom dalam tabel penting dalam aplikasi saya - pada dasarnya saya perlu tahu 'Apa itu kolom (n) disebut ? '

sp_columns mengembalikan sejumlah besar hal-hal asing, dan saya lebih mudah dengan fungsi pilih daripada T-SQL, jadi saya memilih rute ini:

select    
  syscolumns.name, 
  syscolumns.colid    
from     
  sysobjects, syscolumns  
where 
  sysobjects.id = syscolumns.id and   
  sysobjects.xtype = 'u' and   
  sysobjects.name = '<YOUR_TABLE>' 
order by syscolumns.colid 

Saya menggunakan metode ini untuk waktu yang lama, tetapi disarankan untuk tidak melakukannya. Sebenarnya saya menemukan masalah persis yang saya diberitahu mungkin ... itu lebih mungkin bahwa versi baru MSSQL akan mengubah sintaks. Misalnya dulu sys.object dan sys.columns dalam versi saya pertama kali menggunakan teknik ini. Seharusnya skema dan prosedur prosedur tersimpan lebih bukti terhadap ini ... tidak yakin, tapi sejauh ini bagus.
RosieC

1

Sementara jawaban @Gulzar Nazim bagus, mungkin lebih mudah untuk memasukkan nama basis data ke dalam kueri, yang bisa dicapai dengan SQL berikut.

SELECT COLUMN_NAME, *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'you-table-name' AND TABLE_CATALOG='your-database-name'

1

Anda dapat menggunakan kode di bawah ini untuk mencetak semua nama kolom; Anda juga dapat memodifikasi kode untuk mencetak detail lain dalam format apa pun yang Anda suka

    declare @Result varchar(max)='
            '
            select @Result=@Result+''+ColumnName+'
            '
            from
            (
                select
                    replace(col.name, ' ', '_') ColumnName,
                    column_id ColumnId
                from sys.columns col
                    join sys.types typ on
                        col.system_type_id = typ.system_type_id AND col.user_type_id = typ.user_type_id
                where object_id = object_id('tblPracticeTestSections')
            ) t
            order by ColumnId
            print @Result

Keluaran

column1
column2
column3
column4

Untuk menggunakan kode yang sama untuk mencetak tabel dan nama kolomnya sebagai kelas C # gunakan kode di bawah ini:

    declare @TableName sysname = '<EnterTableName>'
    declare @Result varchar(max) = 'public class ' + @TableName + '
    {'

    select @Result = @Result + '
        public static string ' + ColumnName + ' { get { return "'+ColumnName+'"; } }
    '
    from
    (
        select
            replace(col.name, ' ', '_') ColumnName,
            column_id ColumnId
        from sys.columns col
            join sys.types typ on
                col.system_type_id = typ.system_type_id AND col.user_type_id = typ.user_type_id
        where object_id = object_id(@TableName)
    ) t
    order by ColumnId

    set @Result = @Result  + '
    }'

    print @Result

Keluaran:

 public class tblPracticeTestSections
 {
   public static string column1 { get { return "column1"; } }

   public static string column2{ get { return "column2"; } }

   public static string column3{ get { return "column3"; } }

   public static string column4{ get { return "column4"; } }

 } 

0

Saya hanya menggunakan kueri seperti yang disebutkan Martin Smith, hanya sedikit lebih pendek:

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTableName'

0
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'TableName'

0

Karena SysColumns sudah tidak digunakan lagi , gunakan Sys.All_Columns:

Select  
 ObjectName       = Object_Name(Object_ID)  
,T.Name  
,C.*  
,T.*  
From   
           Sys.All_Columns C  
Inner Join Sys.Types       T  On T.User_Type_Id = C.User_Type_Id  
Where [Object_ID] = Object_ID('Sys.Server_Permissions')  
--Order By Name Asc  

Select * From Sys.Typesakan menghasilkan user_type_id = IDjenis. Ini unik di dalam basis data. Untuk jenis data sistem: user_type_id = system_type_id.


0
DECLARE @col NVARCHAR(MAX);
SELECT @col= COALESCE(@col, '') + ',' + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS WHERE  Table_name = 'MxLocations';
SELECT @col;

0

JIKA Anda bekerja dengan postgresql, ada kemungkinan lebih dari satu skema memiliki tabel dengan nama yang sama dalam hal ini berlaku permintaan di bawah ini

SELECT column_name, data_type 
FROM information_schema.columns
WHERE table_name = 'your_table_name' AND table_schema = 'your_schema_name’;

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.