如何从SQL Server中的表中获取列名?


715

我想查询表中所有列的名称。我发现如何做到这一点:

但是我需要知道:如何在Microsoft SQL Server(以我的情况为2008)中完成此操作?


48
作为一个快速和肮脏的把戏,我真的很喜欢SELECT * FROM my_table WHERE 1=0
bgusach '16

12
@bgusach-似乎用户希望将列名用作表中的行,但是对于您想要做的事情,SELECT TOP 0 * FROM my_table击键次数更少
Jake Wood

@bgusach:听起来像是对我的回答。您应该发布它。
palswim

Answers:


863

您可以通过查询Information Schema视图获得此信息,甚至更多。

此示例查询:

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

可以在所有这些数据库对象上进行:


25
“ = N'Customers'”中的“ N”代表什么?
Qbik 2014年

20
Qbik“ N”,如果要处理ANSI(32bit)中的varchar和unicode(64bit)中的nvarchar之类的unicode字符串
thatsalok 2014年

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_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

这将从所有表中获取所有列,并按表名和列名排序。


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之类的其他答案不是标准的
Reversed Engineer'Nov

并且如果该表位于另一个模式(SQL Server“ schema”变体)中,请添加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

您可以编写此查询来获取列名和所有详细信息,而无需在MySql中使用INFORMATION_SCHEMA:

SHOW COLUMNS FROM database_Name.table_name;

7
@Benjamin,因为此问题适用于SQL Server,而此答案适用于MySql
2016年

1
可能是大多数使用MySql的人都遇到了这个问题。我已经提到了。我正在使用MySql。
Sachin Parse

5
多数使用其他RDBMS的人是否有相同的问题都没有关系,这与原始问题无关,并将相关答案进一步推低了。
Demonblack

1
我之所以投票,是因为问题专门针对了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 是你的桌子


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

这个SO问题缺少以下方法:

-- 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 STATEMENT TO更改为编辑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]'

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

其他答案是相同的。
Kiquenet

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

简单且不需要任何sys表

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.