Як я можу отримати імена стовпців із таблиці в SQL Server?


715

Я хотів би запитати назву всіх стовпців таблиці. Я дізнався, як це зробити в:

Але мені потрібно знати: як це можна зробити в Microsoft SQL Server (у моєму випадку 2008)?


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 (32bit) та nvarchar в unicode (64bit)
thatsalok,

9
підтвердив: працює і для MariaDB ! :) (без Nortwind....)
jave.web

5
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'tableName';це працює для мене
Павол Травник

1
Мені довелося використовувати, TABLE_SCHEMA = '?' AND TABLE_NAME = '?'оскільки я перебуваю у localhost, і у мене є кілька таблиць з тим самим іменем, але в різних базах даних.
akinuri

194

Ви можете використовувати збережену процедуру sp_column, яка б повертала інформацію, що стосується всіх стовпців для даної таблиці. Більше інформації можна знайти тут 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

Це отримує всі стовпці з усіх таблиць, упорядковані за назвою таблиці, а потім за назвою стовпця.


147
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 не є стандартними
Перевернене інженер

А якщо таблиця знаходиться в іншій схемі (варіант "схеми" сервера 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.


1
це мій улюблений у всі часи скорочений клавіш. Я також призначаю sp_helptext для Cntl-F1. Ці два ярлики разом економить стільки часу!
Пол Уеланд

44

Використовуючи цей запит, ви отримуєте відповідь:

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

35

Ви можете написати цей запит, щоб отримати ім'я стовпця та всі деталі, не використовуючи INFORMATION_SCHEMA в MySql:

SHOW COLUMNS FROM database_Name.table_name;

7
@Benjamin, оскільки це питання стосується SQL Server, і ця відповідь - для MySql
Каймен

1
Можливо, більшість народів, які використовують MySql, стикаються з цією проблемою. І я це згадав. Я використовую MySql.
Sachin Parse

5
Не має значення, чи має більшість людей, що використовують інші RDBMS, таку ж проблему, це не має відношення до оригінального запитання і підштовхує відповідні відповіді далі.
Demonblack

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


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

У цьому питальному запитанні відсутній такий підхід:

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

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'

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


5

Ще один варіант, який, мабуть, більш інтуїтивно зрозумілий:

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

Це дає вам усі назви своїх стовпців в одній колоні. Якщо ви дбаєте про інші метадані, ви можете змінити редагування ВИБІРУВАННЯ ДЛЯ SELECT *.


2

Узагальнення відповідей

Я бачу багато різних відповідей і способів це зробити, але в цьому є і те, що є 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]'


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

Простий і не вимагає будь-яких таблиць sys

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.