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?


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:


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.


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

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


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.


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'

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;

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

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

TABLE_NAME ist dein Tisch


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

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

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'

10

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

desc <TABLE NAME> ;

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

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

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


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

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

Andere Antworten sind die gleichen.
Kiquenet

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

Einfach und erfordert keine Systemtabellen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.