Jak mogę uzyskać nazwy kolumn z tabeli w SQL Server?

715

Chciałbym zapytać o nazwę wszystkich kolumn tabeli. Znalazłem, jak to zrobić w:

Ale muszę wiedzieć: jak można to zrobić w Microsoft SQL Server (w moim przypadku 2008)?

odiseh
źródło
48
Jako szybki i brudny trik, naprawdę lubię to robićSELECT * FROM my_table WHERE 1=0
bgusach
12
@bgusach - Wygląda na to, że użytkownik chciał, aby nazwy kolumn były wierszami w tabeli, ale do tego, co próbujesz zrobić, SELECT TOP 0 * FROM my_tablejest mniej naciśnięć klawiszy
Jake Wood
@busus: To dla mnie brzmi jak odpowiedź. Powinieneś to opublikować.
palswim

Odpowiedzi:

863

Możesz uzyskać te informacje i wiele, wiele więcej, sprawdzając widoki schematów informacyjnych .

To przykładowe zapytanie:

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

Można wykonać na wszystkich tych obiektach DB:

Luke Burns
źródło
25
co oznacza „N” w „= N'Customers”?
Qbik
20
Qbik „N”, jeśli do przekazywania łańcucha znaków Unicode, takiego jak varchar w ANSI (32-bitowy) i nvarchar w Unicode (64
bitowy
9
potwierdzone: działa również dla MariaDB ! :) (bez Nortwind....)
jave.web
5
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'tableName';to działa dla mnie
Pavol Travnik
1
Musiałem użyć, TABLE_SCHEMA = '?' AND TABLE_NAME = '?'ponieważ jestem na localhost i mam wiele tabel o tej samej nazwie, ale w różnych bazach danych.
akinuri
194

Możesz użyć procedury składowanej sp_columns, która zwróciłaby informacje dotyczące wszystkich kolumn dla danej tabeli. Więcej informacji można znaleźć tutaj http://msdn.microsoft.com/en-us/library/ms176077.aspx

Możesz to również zrobić za pomocą zapytania SQL. Takie rzeczy powinny pomóc:

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

Inną odmianą byłoby:

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

Spowoduje to pobranie wszystkich kolumn ze wszystkich tabel, uporządkowanych według nazwy tabeli, a następnie według nazwy kolumny.

Arnkrishn
źródło
147
select *
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='tableName'

Jest to lepsze niż uzyskiwanie, sys.columnsponieważ pokazuje DATA_TYPEbezpośrednio.

Limin
źródło
5
+1, ponieważ jest to standardowy ANSI SQL ( en.wikipedia.org/wiki/Information_schema ) Inne odpowiedzi, takie jak sys.objects, nie są standardowe
Reversed Engineer
A jeśli stół jest w innym schemacie (serwer wariantu „Schemat” SQL) dodać AND TABLE_SCHEMA = 'schemaName'w WHEREklauzuli.
Johan
Bardzo przydatne, możesz dodać JOIN sys.types t on c.system_type_id = t.system_type_idi dodać t.namew instrukcji SELECT, aby uzyskać typy obok nazwy każdej kolumny.
Pac0,
56

Możesz używać sp_helpw SQL Server 2008.

sp_help <table_name>;

Skrót klawiaturowy dla powyższego polecenia: wybierz nazwę tabeli (tzn. Podświetl ją) i naciśnij ALT+ F1.

mr_eclair
źródło
1
to mój ulubiony skrót klawiszowy. Przypisuję również sp_helptext do Cntl-F1. Te dwa skróty pozwalają zaoszczędzić tyle czasu!
Paul Wehland,
44

Korzystając z tego zapytania, otrzymujesz odpowiedź:

select Column_name 
from Information_schema.columns 
where Table_name like 'table name'
KuldipMCA
źródło
35

Możesz napisać to zapytanie, aby uzyskać nazwę kolumny i wszystkie szczegóły bez użycia INFORMACJE_SCHEMA w MySql:

SHOW COLUMNS FROM database_Name.table_name;
Sachin Parse
źródło
7
@Benjamin, ponieważ to pytanie dotyczy programu SQL Server, a odpowiedź dotyczy MySql
Caimen
1
Być może większość ludzi korzystających z MySql napotyka ten problem. I wspomniałem o tym. Korzystam z MySql.
Sachin Parse
5
Nie ma znaczenia, czy większość ludzi korzystających z innych RDBMS ma ten sam problem, nie ma znaczenia dla pierwotnego pytania i spycha odpowiednie odpowiedzi dalej.
Demonblack
1
Oddaję głos, ponieważ pytanie dotyczy konkretnie mssql
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
źródło
22
SELECT name
FROM sys.columns
WHERE object_id = OBJECT_ID('TABLE_NAME')

TABLE_NAME jest twój stół

klocki
źródło
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
źródło
12

Po prostu uruchom to polecenie

EXEC sp_columns 'Your Table Name'
Hardeep Singh
źródło
2
nie daje pożądanego rezultatu
Amit chauhan
11

W tym pytaniu SO brakuje następującego podejścia:

-- List down all columns of table 'Logging'
select * from sys.all_columns where object_id = OBJECT_ID('Logging')
NeverHopeless
źródło
10

Sprawdzi, czy podana tablejest tabela podstawowa .

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
źródło
10

Możesz wypróbować tę opcję, aby uzyskać wszystkie nazwy kolumn z odpowiadającymi im typami danych.

desc <TABLE NAME> ;
Ishaan Arora
źródło
Wiem, że to działa w Oracle. Ale czy to działa w Microsft SQL? Dziękuję Ci.
DxTx
6

możesz użyć tego zapytania

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

Inną opcją, która jest prawdopodobnie bardziej intuicyjna, jest:

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

Daje to wszystkie nazwy kolumn w jednej kolumnie. Jeśli zależy Ci na innych metadanych, możesz zmienić edycję WYBIERZ OŚWIADCZENIE NA SELECT *.

Samuel Nde
źródło
2

Podsumowanie odpowiedzi

Widzę wiele różnych odpowiedzi i sposobów, aby to zrobić, ale jest w tym pocierania i to jest to objective.

Tak, cel. Jeśli chcesz only knownazwy kolumn, których możesz użyć

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

Ale jeśli chcesz usegdzieś te kolumny lub po prostu manipulateje wypowiedzieć, powyższe szybkie zapytania nie przydadzą się. Musisz użyć

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

jeszcze jeden sposób na poznanie niektórych konkretnych kolumn, w których potrzebujemy podobnych kolumn

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME like N'%[ColumnName]%' and TABLE_NAME = N'[TableName]'
Shreekant
źródło
1
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'name_of_your_table'
onavascuez
źródło
Inne odpowiedzi są takie same.
Kiquenet,
0
SELECT TOP (0) [toID]
      ,[sourceID]
      ,[name]
      ,[address]
  FROM [ReportDatabase].[Ticket].[To]

Prosty i nie wymaga żadnych tabel sys

Hawkzey
źródło