Wie kann ich Spaltennamen aus einer Tabelle in SQL Server abrufen?

715

Ich möchte den Namen aller Spalten einer Tabelle abfragen. Wie das geht, habe ich gefunden in:

Aber ich muss wissen: Wie kann das in Microsoft SQL Server (in meinem Fall 2008) gemacht werden?

odiseh
quelle
48
Als schnellen und schmutzigen Trick mache ich das wirklich gerneSELECT * FROM my_table WHERE 1=0
bgusach
12
@bgusach - Scheint, als wollte der Benutzer die Namen von Spalten als Zeilen in einer Tabelle, aber für das, was Sie versuchen, SELECT TOP 0 * FROM my_tablesind weniger Tastenanschläge
Jake Wood
@bgusach: Das klingt nach einer Antwort für mich. Du solltest es posten.
Palswim

Antworten:

863

Sie können diese und viele weitere Informationen erhalten, indem Sie die Ansichten des Informationsschemas abfragen .

Diese Beispielabfrage:

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

Kann über alle diese DB-Objekte erstellt werden:

Luke Burns
quelle
25
Wofür steht "N" in "= N'Customers '"?
Qbik
20
Qbik "N", wenn für die Behandlung von Unicode-Zeichenfolgen wie varchar in ANSI (32 Bit) und nvarchar in Unicode (64 Bit)
thatsalok
9
bestätigt: funktioniert auch für MariaDB ! :) (ohne Nortwind....)
jave.web
5
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'tableName';das funktioniert bei mir
Pavol Travnik
1
Ich musste verwenden, TABLE_SCHEMA = '?' AND TABLE_NAME = '?'da ich auf localhost bin und mehrere Tabellen mit demselben Namen, aber in verschiedenen Datenbanken habe.
Akinuri
194

Sie können die gespeicherte Prozedur sp_columns verwenden, die Informationen zu allen Spalten für eine bestimmte Tabelle zurückgibt. Weitere Informationen finden Sie hier http://msdn.microsoft.com/en-us/library/ms176077.aspx

Sie können dies auch über eine SQL-Abfrage tun. So etwas sollte helfen:

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

Oder eine Variation wäre:

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

Dadurch werden alle Spalten aus allen Tabellen abgerufen, sortiert nach Tabellennamen und dann nach Spaltennamen.

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

Dies ist besser als von zu bekommen, sys.columnsweil es DATA_TYPEdirekt zeigt .

Limin
quelle
5
+1, da dies Standard-ANSI-SQL ist ( en.wikipedia.org/wiki/Information_schema ) Andere Antworten wie sys.objects sind nicht Standard
Reversed Engineer
Und wenn sich die Tabelle in einem anderen Schema befindet (die SQL Server "Schema" -Variante), fügen Sie AND TABLE_SCHEMA = 'schemaName'die WHEREKlausel hinzu.
Johan
Sehr nützlich, und Sie können Ihre 'SELECT'-Anweisung hinzufügen JOIN sys.types t on c.system_type_id = t.system_type_idund hinzufügen t.name, um auch die Typen neben jedem Spaltennamen abzurufen.
Pac0
56

Sie können sp_helpin SQL Server 2008 verwenden.

sp_help <table_name>;

Tastaturkürzel für den obigen Befehl: Wählen Sie den Tabellennamen aus (dh markieren Sie ihn) und drücken Sie ALT+ F1.

mr_eclair
quelle
1
Dies ist meine Lieblings-Tastaturkürzel aller Zeiten. Ich weise Cntl-F1 auch sp_helptext zu. Zusammen sparen diese beiden Verknüpfungen so viel Zeit!
Paul Wehland
44

Mit dieser Abfrage erhalten Sie die Antwort:

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

Sie können diese Abfrage schreiben, um den Spaltennamen und alle Details abzurufen, ohne INFORMATION_SCHEMA in MySql zu verwenden:

SHOW COLUMNS FROM database_Name.table_name;
Sachin Parse
quelle
7
@ Benjamin, weil diese Frage für SQL Server ist und diese Antwort für MySql
Caimen
1
Möglicherweise sind die meisten Leute, die MySql verwenden, mit diesem Problem konfrontiert. Und ich habe es erwähnt. Ich benutze MySql.
Sachin Parse
5
Es spielt keine Rolle, ob die meisten Benutzer anderer RDBMS das gleiche Problem haben, es ist für die ursprüngliche Frage irrelevant und drückt relevante Antworten weiter nach unten.
Demonblack
1
Ich stimme ab, weil die Frage speziell an mssql gerichtet ist
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
Doc
quelle
22
SELECT name
FROM sys.columns
WHERE object_id = OBJECT_ID('TABLE_NAME')

TABLE_NAME ist dein Tisch

bstricks
quelle
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
quelle
12

Führen Sie einfach diesen Befehl aus

EXEC sp_columns 'Your Table Name'
Hardeep Singh
quelle
2
Es gibt nicht das gewünschte Ergebnis
Amit Chauhan
11

Dieser SO-Frage fehlt der folgende Ansatz:

-- List down all columns of table 'Logging'
select * from sys.all_columns where object_id = OBJECT_ID('Logging')
NeverHopeless
quelle
10

Es wird überprüft , ob die angesichts der tableist Basistabelle .

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
quelle
10

Sie können dies versuchen. Dies gibt alle Spaltennamen mit ihren jeweiligen Datentypen an.

desc <TABLE NAME> ;
Ishaan Arora
quelle
Ich weiß, dass dies in Oracle funktioniert. Aber funktioniert das in Microsoft SQL? Vielen Dank.
DxTx
6

Sie können diese Abfrage verwenden

SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME like N'%[ColumnName]%' and TABLE_NAME = N'[TableName]'
reza akhlaghi
quelle
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
quelle
5

Eine andere Option, die wohl intuitiver ist, ist:

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

Dadurch erhalten Sie alle Spaltennamen in einer einzigen Spalte. Wenn Sie sich für andere Metadaten interessieren, können Sie die SELECT STATEMENT TO ändern SELECT *.

Samuel Nde
quelle
3

Die Antworten zusammenfassen

Ich kann viele verschiedene Antworten und Möglichkeiten sehen, dies zu tun, aber da ist das Problem und das ist das objective.

Ja, das Ziel. Wenn Sie only knowdie Spaltennamen möchten, können Sie verwenden

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

Aber wenn Sie usediese Spalten irgendwo haben oder sie einfach sagen möchten, sind die manipulateobigen schnellen Abfragen nicht von Nutzen. Sie müssen verwenden

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

eine weitere Möglichkeit, einige bestimmte Spalten zu kennen, in denen wir ähnliche Spalten benötigen

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME like N'%[ColumnName]%' and TABLE_NAME = N'[TableName]'
Shreekant
quelle
1
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'name_of_your_table'
Onavascuez
quelle
Andere Antworten sind die gleichen.
Kiquenet
0
SELECT TOP (0) [toID]
      ,[sourceID]
      ,[name]
      ,[address]
  FROM [ReportDatabase].[Ticket].[To]

Einfach und erfordert keine Systemtabellen

Hawkzey
quelle