Wie geben Sie die Spaltennamen einer Tabelle zurück?

239

Wie würde ich die Spaltennamen einer Tabelle mit SQL Server 2008 zurückgeben? dh eine Tabelle enthält diese Spalten-ID, Name, Adresse, Land und ich möchte diese als Daten zurückgeben.

Belliez
quelle

Antworten:

399

Ich bin mir nicht sicher, ob es in der Version 2008 einen einfacheren Weg gibt.

USE [Database Name]
SELECT COLUMN_NAME,* 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTableName' AND TABLE_SCHEMA='YourSchemaName'
Gulzar Nazim
quelle
6
Was ist der 'YourSchemaName'?
Drewdin
12
'YourSchemaName' ist das Schema für die Tabelle, für die Sie eine Abfrage durchführen. Beispiel: dbo.myTable, 'dbo' ist das Schema, zu dem 'myTable' gehört. Schemata erleichtern das Zuweisen von Berechtigungen zu einer Gruppierung anstelle jeder Tabelle einzeln. Siehe auch diese Frage: stackoverflow.com/questions/1062075/…
jmosesman
3
Vergessen Sie nicht den Befehl USE DatabaseName, sonst können Sie im Master oder in einer anderen Datenbank suchen, als Sie möchten
Muflix
1
SELECT COLUMN_NAME, * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'YourTableName' UND TABLE_SCHEMA = 'dbo'
Usman Younas
112

Dies ist der einfachste Weg

exec sp_columns [tablename]
DiggDev
quelle
2
Dies ist kurz und einfach, sollte die richtige Antwort sein. Ich kann mir vorstellen, dass es nicht existierte, als die Frage ursprünglich gestellt wurde :)
DanteTheSmith
1
Wenn Ihr Schema nicht dbo ist, müssen Sie es als zusätzlichen Parameter übergeben. exec sp_columns [TableName], @table_owner = [Schema]
Pradeep
32

Etwas wie das?

sp_columns @table_name=your table name
Paul Lefebvre
quelle
13

Eine Methode besteht darin, syscolumns abzufragen:

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
splattne
quelle
1
Ich mag diesen wirklich. Ich finde die ObjtypeSpalte jedoch überflüssig :)
Joel
1
Wäre es nicht besser, den Join vollständig auszuschreiben (sysobjects so inner join syscolumns sc on so.id = sc.id)? Dies scheint eine träge Antwort auf Kosten der Leistung zu sein. Ich könnte mich irren ...
Losbear
1
@Losbear hat es geändert PS: Nicht faul, es ist nur Code von vor 8 Jahren. :) In alten Zeiten (ich habe SQL Server ab Version 4.2 verwendet) habe ich SQL-Abfragen auf diese Weise geschrieben. Keine Leistungsprobleme.
Splattne
9

Dies scheint etwas einfacher zu sein als die obigen Vorschläge, da die Funktion OBJECT_ID () zum Auffinden der Tabellen-ID verwendet wird. Jede Spalte mit dieser ID ist Teil der Tabelle.

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

Ich verwende normalerweise eine ähnliche Abfrage, um festzustellen, ob eine Spalte vorhanden ist, von der ich weiß, dass sie Teil einer neueren Version ist. Es ist dieselbe Abfrage mit dem Zusatz von {AND name = 'YOUR_COLUMN'} zur where-Klausel.

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

Versuche dies

select * from <tablename> where 1=2

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

Shanmugam Sudalaimuthu
quelle
Interessant, aber welche Logik steckt dahinter?
Nilakantha Singh Deo
@nilakanthasinghdeo, die Logik ist, dass es immer null Zeilen mit zurückgibt WHERE 1=2und es weiterhin die Spalten-Metadaten zurückgibt . Wenn Sie eine programmatische Schnittstelle wie ODBC verwenden, können Sie auf diese Spalteninformationen als Liste / Array über das Cursorobjekt im Programm zugreifen, nach dem ich gesucht habe. In einem reinen SQL-Kontext ist dies möglicherweise nicht sinnvoll, aber es ist ein prägnanter Ansatz, wenn eine Verbindung zu einer Datenbank über Python / Java / C / etc. Hergestellt wird.
Arthur Hebert
5

Das Folgende scheint wie die erste vorgeschlagene Abfrage oben zu sein, aber manchmal müssen Sie die Datenbank angeben, damit sie funktioniert. Beachten Sie, dass die Abfrage auch ohne Angabe von TABLE_SCHEMA funktionieren sollte:

SELECT COLUMN_NAME
FROM   YOUR_DB_NAME.INFORMATION_SCHEMA.COLUMNS
WHERE  TABLE_NAME = 'YOUR_TABLE_NAME' AND TABLE_SCHEMA = 'YOUR_DB_NAME'
Edi Mohseni
quelle
4

ich benutze

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%'
Scott K.
quelle
3

Warum versuchen Sie es nicht einfach so:

Klicken Sie mit der rechten Maustaste auf die Tabelle -> Skripttabelle als -> Erstellen bis -> Neues Abfrageeditorfenster?

Die gesamte Liste der Spalten wird im Skript angegeben. Kopieren Sie es und verwenden Sie die Felder nach Bedarf.

angieb1008
quelle
3
Der Autor wollte wahrscheinlich wissen, wie die Spaltennamen programmgesteuert aus der Tabelle abgerufen werden können, um sie in einer gespeicherten Prozedur oder einem anderen Skript zu verwenden.
KLee1
1
In der Antwort heißt es "I want to return these as data", während Ihre Antwort die Werte erhält, möchte das OP die Daten wahrscheinlich zur Laufzeit.
StuperUser
2

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

Deepan Kanugula
quelle
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
Rishikesh
quelle
2
Willkommen bei SO! Aber es sieht so aus, als hätte diese Frage bereits vor ungefähr drei Jahren eine zufriedenstellende Antwort erhalten ... Verwenden Sie beim Posten des Codes auch das {}, um sie hervorzuheben. Werfen
Valentino Vranken
1

Ich bin nicht sicher, ob der Wert von syscolumns.colid mit dem Wert von 'ORDINAL_POSITION' übereinstimmt, der als Teil von sp_columns zurückgegeben wird, aber im Folgenden verwende ich ihn auf diese Weise - ich hoffe, ich informiere mich nicht falsch ...

Hier ist eine kleine Abweichung von einigen der anderen Antworten, die ich gefunden habe - ich verwende diese, weil die 'Position' oder Reihenfolge der Spalte in der Tabelle in meiner Anwendung wichtig ist - ich muss im Grunde wissen, wie Spalte (n) heißt ? '

sp_columns gibt eine ganze Reihe von irrelevanten Dingen zurück, und ich bin handlicher mit ausgewählten als T-SQL-Funktionen, also bin ich diesen Weg gegangen:

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 
Jake
quelle
Ich habe diese Methode lange angewendet, wurde aber davon abgeraten. Tatsächlich habe ich genau das Problem getroffen, von dem mir gesagt wurde, dass ich es könnte ... es ist wahrscheinlicher, dass neue Versionen von MSSQL die Syntax ändern. In den Versionen, in denen ich diese Technik zum ersten Mal verwendet habe, waren es beispielsweise sys.object und sys.columns. Angeblich sind das Schema und die gespeicherten Prozedurmethoden ein Beweis dafür ... nicht sicher, aber bisher so gut.
RosieC
1

Während die Antwort von @Gulzar Nazim großartig ist, ist es wahrscheinlich einfacher, den Datenbanknamen in die Abfrage aufzunehmen, was durch die folgende SQL erreicht werden könnte.

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

Mit dem folgenden Code können Sie alle Spaltennamen drucken. Sie können den Code auch ändern, um andere Details in einem beliebigen Format zu drucken

    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

Ausgabe

column1
column2
column3
column4

Verwenden Sie den folgenden Code, um denselben Code zum Drucken der Tabelle und ihres Spaltennamens wie die C # -Klasse zu verwenden:

    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

Ausgabe:

 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"; } }

 } 
Atal Kishore
quelle
0

Ich benutze nur eine Abfrage wie Martin Smith erwähnt, nur etwas kürzer:

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTableName'
Marcel Grolms
quelle
0
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'TableName'
Vishal Kiri
quelle
0

Da SysColumns veraltet ist , verwenden Sie 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.Typeswird user_type_id = IDvom Typ ergeben. Dies ist innerhalb der Datenbank eindeutig. Für Systemdatentypen : user_type_id = system_type_id.

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

Wenn Sie mit postgresql arbeiten, besteht die Möglichkeit, dass mehr als ein Schema eine Tabelle mit demselben Namen hat. In diesem Fall wenden Sie die folgende Abfrage an

SELECT column_name, data_type 
FROM information_schema.columns
WHERE table_name = 'your_table_name' AND table_schema = 'your_schema_name’;
abhinav kumar
quelle
-3
set fmtonly on
select * from yourTable
Jimbo
quelle