Bir tablonun sütun adlarını nasıl döndürürsünüz?


239

SQL Server 2008 kullanarak bir tablonun sütun adlarını nasıl döndürürüm? yani bir tablo bu sütunları-id, isim, adres, ülke içerir ve ben veri olarak dönmek istiyorum.

Yanıtlar:


400

2008 sürümünde daha kolay bir yol olup olmadığından emin değilim.

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

6
'YourSchemaName' nedir?
Drewdin

12
'YourSchemaName' sorguladığınız tablonun şemasıdır. Örnek: dbo.myTable, 'dbo', 'myTable'ın ait olduğu şemadır. Şemalar, her tablo yerine ayrı ayrı gruplara izin atamayı kolaylaştırır. Bu soruya da bakın: stackoverflow.com/questions/1062075/…
jmosesman

3
VeritabanıAdı KULLAN komutunu unutmayınız, aksi takdirde master veya istediğinizden farklı bir veritabanında arama yapabilirsiniz
Muflix

1
COLUMN_NAME, * BİLGİ_SCHEMA.COLUMNS'DEN SEÇİNİZ TABLO = 'SizinTabloAdınız' VE TABLE_SCHEMA = 'dbo'
Usman

112

Bu en kolay yol

exec sp_columns [tablename]

2
Bu kısa ve basit, doğru cevap olmalı. Soru başlangıçta sorulduğunda var olmadığını hayal ediyorum :)
DanteTheSmith

1
Şemanız dbo değilse, ek bir parametre olarak iletmeniz gerekir. exec sp_columns [TableName], @table_owner = [şema]
Pradeep


13

Bir yöntem syscolumns sorgulamaktır:

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
Bunu gerçekten beğendim. ObjtypeYine de sütun gereksiz buluyorum :)
Joel

1
Birleşimi tam olarak yazmak daha iyi olmaz mı? Bu, performans pahasına tembel bir cevap gibi görünüyor. Yanlış olabilirdim ...
Losbear

1
@Losbear bunu değiştirdi PS: Tembel değil, 8 yıl önce sadece kod. :) Eski zamanlarda (4.2 sürümünden başlayarak SQL Server kullandım), SQL sorgularını bu şekilde yazardım. performans sorunu yok.
splattne

9

Tablonun kimliğini bulmak için OBJECT_ID () işlevini kullandığından yukarıdaki önerilerden biraz daha kolay görünüyor . Bu kimliğe sahip herhangi bir sütun tablonun bir parçasıdır.

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

Genellikle benzer bir sorgu, yeni bir sürümünün bir parçası olduğunu bildiğim bir sütun olup olmadığını görmek için kullanın. Bu, nereye yan tümcesine {AND name = 'YOUR_COLUMN'} eklenmesiyle aynı sorgudur.

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

8

bunu dene

select * from <tablename> where 1=2

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


İlginç, ama arkasındaki mantık nedir?
nilakantha singh deo

@nilakanthasinghdeo, mantık her zaman sıfır satır döndürecek WHERE 1=2ve yine de sütun meta verilerini döndürecektir. ODBC gibi programlı bir arabirim kullanıyorsanız, bu sütun bilgisine, programın içindeki imleç nesnesinden bir liste / dizi olarak erişilebilir, aradığım şey budur. Saf bir SQL bağlamında mantıklı gelmeyebilir, ancak bir veritabanına Python / Java / C / etc aracılığıyla bağlanırken kısa ve özlü bir yaklaşımdır.
Arthur Hebert

5

Aşağıdaki yukarıdaki ilk önerilen sorgu gibi görünüyor, ancak bazen veritabanını çalışması için belirtmeniz gerekir. Sorgunun TABLE_SCHEMA belirtilmeden de çalışması gerektiğini unutmayın:

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

4

kullanırım

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

Neden sadece denemiyorsunuz:

tabloya sağ tıklayın -> Komut Dosyası Tablosu -> Oluştur -> Yeni Sorgu Düzenleyici Penceresi?

Tüm sütun listesi kodda verilir. Kopyalayın ve alanları gerektiği gibi kullanın.


3
Yazar muhtemelen, saklı yordamda veya başka bir komut dosyasında kullanmak üzere sütun adlarını tablodan programlı olarak almayı bilmek istemiştir.
KLee1

1
Yanıt "I want to return these as data", cevabınız değerleri alacak olsa da, OP'nin büyük olasılıkla çalışma zamanında veri istemesi muhtemeldir.
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
SO hoş geldiniz! Ama görünüşe göre bu soru yaklaşık üç yıl önce tatmin edici bir cevap aldı ... Ayrıca, kod gönderirken {} ile vurgulayın. SSS'ye bir göz atın, buradan başlamak için bazı iyi bilgilere sahip: stackoverflow.com/faq
Valentino Vranken

1

Syscolumns.colid değerinin sp_columns'ın bir parçası olarak döndürülen 'ORDINAL_POSITION' değeri ile aynı olup olmadığından emin değilim, ancak aşağıdaki şekilde kullanıyorum - umarım yanlış bilgi vermiyorum ...

İşte bulduğum bazı diğer cevaplar üzerinde küçük bir varyasyon - Bunu kullanıyorum çünkü tablodaki sütunun 'konumu' veya sırası önemlidir - Temel olarak şunu bilmeliyim 'Sütun (n) nedir? ?'

sp_columns bir sürü yabancı şey döndürür ve ben T-SQL işlevlerinden daha fazla bir seçim ile işleyiciyim, bu yüzden bu yolu gittim:

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 

Bu yöntemi uzun süre kullandım, ancak ona karşı tavsiye edildi. Aslında söyleyebileceğim tam soruna çarptım ... MSSQL'in yeni sürümlerinin sözdizimini değiştirmesi daha olası. Örneğin, bu tekniği ilk kez kullandığım versiyonlarda sys.object ve sys.columns'dı. Sözde şema ve saklı yordam yöntemleri buna karşı daha kanıtlıdır ... emin değilim, ama şimdiye kadar iyi.
RosieC

1

@Gulzar Nazim'in cevabı harika olsa da , sorguya veritabanı adını eklemek daha kolay olabilir, bu da aşağıdaki SQL ile elde edilebilir.

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

1

Tüm sütun adlarını yazdırmak için aşağıdaki kodu kullanabilirsiniz; İstediğiniz formatta diğer ayrıntıları yazdırmak için kodu da değiştirebilirsiniz.

    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

Çıktı

column1
column2
column3
column4

Tablo ve sütun adını C # sınıfı olarak yazdırmak için aynı kodu kullanmak için aşağıdaki kodu kullanın:

    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

Çıktı:

 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

Sadece Martin Smith gibi bir sorgu kullanın, sadece biraz daha kısa:

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

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

0

Yana syscolumns kullanımdan kaldırılmıştır , kullanmak 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.Typesverecek user_type_id = IDÇeşidi. Bu veritabanı içinde benzersizdir. Sistem veri türleri için: 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

Postgresql ile çalışıyorsanız, bu durumda birden fazla şemanın aynı ada sahip bir tabloya sahip olma olasılığı aşağıdaki sorguyu uygulayın

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.