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


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:


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.


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

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


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.


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'

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;

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

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

TABLE_NAME jest twój stół


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

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

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'

10

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

desc <TABLE NAME> ;

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

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

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


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

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.