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

odi*_*seh 648 sql t-sql sql-server sql-server-2008

我想查询表的所有列的名称.我找到了如何做到这一点:

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

小智 779

您可以通过查询信息架构视图来获取此信息以及更多信息.

此示例查询:

SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'Customers'
Run Code Online (Sandbox Code Playgroud)

可以在所有这些DB对象上进行:

  • "= N'Customers'"中的"N"代表什么? (19认同)
  • Qbik"N"用于在ANSI(32位)中处理类似varchar的unicode字符串,在unicode(64位)中处理nvarchar (18认同)
  • 确认:也适用于**MariaDB**!:)(没有`Nortwind ... ...) (9认同)
  • 从``INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'tableName'中选择COLUMN_NAME;'' (2认同)
  • 我必须使用“TABLE_SCHEMA = '?'” AND TABLE_NAME = '?'` 因为我在本地主机上,并且有多个同名但在不同数据库中的表。 (2认同)
  • 如果您没有获得确切的表名称,请使用 TABLE_NAME(如 'Customers')而不是 TABLE_NAME = N'Customers' (2认同)

Arn*_*shn 187

您可以使用存储过程sp_columns,它将返回与给定表的所有列有关的信息.更多信息可以在这里找到http://msdn.microsoft.com/en-us/library/ms176077.aspx

您也可以通过SQL查询来完成.这样的事情应该有所帮助 -

SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('dbo.yourTableName') 
Run Code Online (Sandbox Code Playgroud)

或者变化是:

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
Run Code Online (Sandbox Code Playgroud)

这将获取所有表中的所有列,按表名排序,然后按列名排序.


Lim*_*min 142

select *
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='tableName'
Run Code Online (Sandbox Code Playgroud)

这比获取更好,sys.columns因为它DATA_TYPE直接显示.

  • +1,因为这是标准的ANSI SQL(https://en.wikipedia.org/wiki/Information_schema)其他答案,如sys.objects不标准 (5认同)

mr_*_*air 54

您可以sp_help在SQL Server 2008中使用.

sp_help <table_name>;
Run Code Online (Sandbox Code Playgroud)

上述命令的键盘快捷方式:选择表名(即突出显示)并按ALT+ F1.

  • 这是我一直以来最喜欢的键盘快捷键。我还将 sp_helptext 分配给 Cntl-F1。这两个快捷方式一起节省了很多时间! (2认同)

Kul*_*MCA 43

通过使用此查询,您可以得到答案:

select Column_name 
from Information_schema.columns 
where Table_name like 'table name'
Run Code Online (Sandbox Code Playgroud)


Sac*_*rse 34

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

SHOW COLUMNS FROM database_Name.table_name;
Run Code Online (Sandbox Code Playgroud)

  • @Benjamin,因为这个问题是针对SQL Server而且这个答案是针对MySql的 (7认同)
  • 多数使用其他RDBMS的人是否有相同的问题都没有关系,这与原始问题无关,并将相关答案进一步推低了。 (3认同)
  • 可能大多数使用 MySql 的人都面临这个问题。我已经提到过了。我正在使用 MySql。 (2认同)
  • 我投反对票,因为这个问题是专门针对 mssql 的 (2认同)

小智 25

- 这是用于记录大型数据库进行转换的另一种变体(编辑为 - 删除静态列)

--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
Run Code Online (Sandbox Code Playgroud)

- 在左连接中,c.type被c.xtype替换以获取varchar类型


bst*_*cks 20

SELECT name
FROM sys.columns
WHERE object_id = OBJECT_ID('TABLE_NAME')
Run Code Online (Sandbox Code Playgroud)

// TABLE_NAME是你的桌子


off*_*dal 18

您可以尝试使用:-

USE db_name;
DESCRIBE table_name;
Run Code Online (Sandbox Code Playgroud)

它会给你列名和类型。


Mus*_*afa 17

在 SQL Server 中,您可以从 中选择 COLUMN_NAME INFORMATION_SCHEMA.COLUMNS

这是代码:

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='YourTableName'
Run Code Online (Sandbox Code Playgroud)


小智 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
Run Code Online (Sandbox Code Playgroud)


Nev*_*ess 11

这个问题缺少以下方法:

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


小智 11

只需运行此命令

EXEC sp_columns 'Your Table Name'
Run Code Online (Sandbox Code Playgroud)

  • 它没有给出预期的结果 (2认同)

ish*_*ora 10

您可以尝试这个.这会为所有列名提供各自的数据类型.

desc <TABLE NAME> ;
Run Code Online (Sandbox Code Playgroud)


Luv*_*Luv 9

它将检查给定的是否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'
Run Code Online (Sandbox Code Playgroud)


rez*_*ghi 6

你可以使用这个查询

SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME like N'%[ColumnName]%' and TABLE_NAME = N'[TableName]'
Run Code Online (Sandbox Code Playgroud)


小智 5

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
Run Code Online (Sandbox Code Playgroud)


Sam*_*Nde 5

另一种可以说更直观的选项是:

SELECT [name] 
FROM sys.columns 
WHERE object_id = OBJECT_ID('[yourSchemaType].[yourTableName]') 
Run Code Online (Sandbox Code Playgroud)

这将在单个列中为您提供所有列名称。如果您关心其他元数据,您可以更改编辑 SELECT STATEMENT TO SELECT *


Shr*_*ant 5

总结答案

我可以看到许多不同的答案和方法来做到这一点,但这其中有一个问题,那就是objective.

是的,目标。如果你想要only know列名,你可以使用

SELECT * FROM my_table WHERE 1=0
or
SELECT TOP 0 * FROM my_table
Run Code Online (Sandbox Code Playgroud)

但是,如果您想在use某处使用这些列或简单地说出manipulate它们,那么上面的快速查询将没有任何用处。你需要使用

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'Customers'
Run Code Online (Sandbox Code Playgroud)

了解某些特定列的另一种方法,其中我们需要一些类似的列

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME like N'%[ColumnName]%' and TABLE_NAME = N'[TableName]'
Run Code Online (Sandbox Code Playgroud)