Как я могу получить имена столбцов из таблицы в SQL Server?

715

Я хотел бы запросить имя всех столбцов таблицы. Я нашел, как это сделать в:

Но мне нужно знать: как это можно сделать в Microsoft SQL Server (2008 в моем случае)?

odiseh
источник
48
Как быстрый и грязный трюк, мне очень нравится это делатьSELECT * FROM my_table WHERE 1=0
bgusach
12
@bgusach - Похоже, что пользователю нужны имена столбцов в виде строк в таблице, но для того, что вы пытаетесь сделать, нужно SELECT TOP 0 * FROM my_tableменьше нажатий клавиш
Джейк Вуд
@bgusach: Это звучит как ответ для меня. Вы должны опубликовать это.
Palswim

Ответы:

863

Вы можете получить эту информацию и многое, многое другое, запросив представления информационной схемы .

Этот пример запроса:

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

Можно сделать поверх всех этих объектов БД:

Люк Бернс
источник
25
что означает "N" в "= N'Customers '"?
Qbik
20
Qbik "N", если для обработки строки Unicode, например, varchar в ANSI (32 бита) и nvarchar в Unicode (64
бита
9
подтвердил: работает и для MariaDB ! :) (без Nortwind....)
jave.web
5
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'tableName';это работает для меня
Павол Травник
1
Я должен был использовать, TABLE_SCHEMA = '?' AND TABLE_NAME = '?'так как я на локальном хосте, и у меня есть несколько таблиц с одним и тем же именем, но в разных базах данных.
akinuri
194

Вы можете использовать хранимую процедуру sp_columns, которая будет возвращать информацию, относящуюся ко всем столбцам для данной таблицы. Более подробную информацию можно найти здесь http://msdn.microsoft.com/en-us/library/ms176077.aspx

Вы также можете сделать это с помощью запроса SQL. Такая вещь должна помочь:

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

Или вариант будет:

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

Это получает все столбцы из всех таблиц, упорядоченные по имени таблицы, а затем по имени столбца.

Arnkrishn
источник
148
select *
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='tableName'

Это лучше, чем получать, sys.columnsпотому что это показывает DATA_TYPEнапрямую.

Лимин
источник
5
+1, поскольку это стандартный ANSI SQL ( en.wikipedia.org/wiki/Information_schema ) Другие ответы, такие как sys.objects, не являются стандартными
Reversed Engineer
И если таблица находится в другой схеме (вариант «схемы» SQL-сервера), добавьте AND TABLE_SCHEMA = 'schemaName'в WHEREпредложение.
Йохан
Очень полезно, и вы можете добавлять JOIN sys.types t on c.system_type_id = t.system_type_idи добавлять t.nameв свой оператор SELECT, чтобы получить типы рядом с именем каждого столбца.
Pac0
56

Вы можете использовать sp_helpв SQL Server 2008.

sp_help <table_name>;

Сочетание клавиш для вышеуказанной команды: выберите имя таблицы (т.е. выделите его) и нажмите ALT+ F1.

mr_eclair
источник
1
это моя самая любимая клавиатура. Я также назначаю sp_helptext для Cntl-F1. Вместе эти два ярлыка экономят так много времени!
Пол Уэланд
44

Используя этот запрос, вы получите ответ:

select Column_name 
from Information_schema.columns 
where Table_name like 'table name'
KuldipMCA
источник
35

Вы можете написать этот запрос, чтобы получить имя столбца и все детали без использования INFORMATION_SCHEMA в MySql:

SHOW COLUMNS FROM database_Name.table_name;
Сачин Парс
источник
7
@ Бенджамин, потому что этот вопрос для SQL Server, а этот ответ для MySql
Caimen
1
Может быть, большинство людей, использующих MySql, сталкиваются с этой проблемой. И я упомянул это. Я использую MySql.
Sachin Parse
5
Неважно, если у большинства людей, использующих другие СУБД, есть такая же проблема, это не имеет отношения к исходному вопросу и толкает соответствующие ответы дальше.
черный демон
1
Я понижаю голос, потому что вопрос специально адресован mssql
Лукас
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 твой стол

bstricks
источник
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
Петко Петков
источник
12

Просто запустите эту команду

EXEC sp_columns 'Your Table Name'
Хардип Сингх
источник
2
Это не дает желаемого результата
Амит chauhan
11

В этом вопросе отсутствует следующий подход:

-- List down all columns of table 'Logging'
select * from sys.all_columns where object_id = OBJECT_ID('Logging')
NeverHopeless
источник
10

Он проверит ли , учитывая tableэто базовая таблица .

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
источник
10

Вы можете попробовать это. Это дает все имена столбцов с соответствующими им типами данных.

desc <TABLE NAME> ;
ишаан арора
источник
Я знаю, что это работает в Oracle. Но работает ли это в Microsft SQL? Спасибо.
DxTx
6

Вы можете использовать этот запрос

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

Еще один вариант, который, возможно, является более интуитивным:

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

Это дает вам все ваши имена столбцов в одном столбце. Если вы заботитесь о других метаданных, вы можете изменить редактировать SELECT STATEMENT TO SELECT *.

Самуэль Нде
источник
3

Обобщая ответы

Я вижу много разных ответов и способов сделать это, но есть проблема в этом, и это objective.

Да, цель. Если вы хотите, чтобы only knowимена столбцов вы можете использовать

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

Но если вы хотите useгде-то эти столбцы или просто произносите manipulateих, быстрые запросы, приведенные выше, не будут иметь никакого смысла. Вам нужно использовать

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

еще один способ узнать некоторые конкретные столбцы, где мы нуждаемся в некоторых аналогичных столбцах

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME like N'%[ColumnName]%' and TABLE_NAME = N'[TableName]'
Shreekant
источник
1
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'name_of_your_table'
onavascuez
источник
Другие ответы такие же.
Kiquenet
0
SELECT TOP (0) [toID]
      ,[sourceID]
      ,[name]
      ,[address]
  FROM [ReportDatabase].[Ticket].[To]

Простой и не требует каких-либо системных таблиц

Hawkzey
источник