如何从SQLServer中的表中获取列名?

我想查询表的所有列的名称。我在下面找到了如何执行此操作:

但我也需要知道:如何在MicrosoftSQLServer(2008)中完成此操作?

2543035 次浏览

您可以通过查询信息架构视图获得这些信息以及更多信息。

此示例查询:

SELECT *FROM INFORMATION_SCHEMA.COLUMNSWHERE TABLE_NAME = N'Customers'

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

您可以使用存储过程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.NameFROM     sys.columns cJOIN sys.objects o ON o.object_id = c.object_idWHERE    o.type = 'U'ORDER BY o.Name, c.Name

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

通过使用此查询,您将获得答案:

select Column_namefrom Information_schema.columnswhere Table_name like 'table name'
--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 cINNER JOIN sysobjects o ON o.id = c.idLEFT JOIN  systypes t on t.xtype = c.xtypeWHERE o.type = 'U'ORDER BY o.Name, c.Name
--In the left join, c.type is replaced by c.xtype to get varchar types
SELECT column_name, data_type, character_maximum_length, table_name,ordinal_position, is_nullableFROM information_schema.COLUMNS WHERE table_name LIKE 'YOUR_TABLE_NAME'ORDER BY ordinal_position
select *from INFORMATION_SCHEMA.COLUMNSwhere TABLE_NAME='tableName'

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

您可以在SQLServer 2008中使用sp_help

sp_help <table_name>;

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

它将检查给定的table是否为基本表

SELECTT.TABLE_NAME AS 'TABLE NAME',C.COLUMN_NAME AS 'COLUMN NAME'FROM INFORMATION_SCHEMA.TABLES TINNER JOIN INFORMATION_SCHEMA.COLUMNS C ON T.TABLE_NAME=C.TABLE_NAMEWHERE   T.TABLE_TYPE='BASE TABLE'AND T.TABLE_NAME LIKE 'Your Table Name'
SELECT nameFROM sys.columnsWHERE object_id = OBJECT_ID('TABLE_NAME')

TABLE_NAME你的桌子

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

-- List down all columns of table 'Logging'select * from sys.all_columns where object_id = OBJECT_ID('Logging')
SELECT COLUMN_NAMEFROM INFORMATION_SCHEMA.COLUMNSWHERE TABLE_NAME = 'name_of_your_table'

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

SHOW COLUMNS FROM database_Name.table_name;

你可以试试这个。这会给出所有列名及其各自的数据类型。

desc <TABLE NAME> ;

您可以使用此查询

SELECT *FROM INFORMATION_SCHEMA.COLUMNSWHERE COLUMN_NAME like N'%[ColumnName]%' and TABLE_NAME = N'[TableName]'
SELECT c.NameFROM sys.columns cJOIN sys.objects o ON o.object_id = c.object_idWHERE o.object_id = OBJECT_ID('TABLE_NAME')ORDER BY c.Name

只需运行此命令

EXEC sp_columns 'Your Table Name'

另一个可以说是更直观的选择是:

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

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

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

简单,不需要任何sys表

总结答案

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

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

SELECT * FROM my_table WHERE 1=0orSELECT 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]'

一些SQL生成SQL:

DROP TABLE IF EXISTS test;CREATE TABLE test (col001 INTEGER, col002 INTEGER, col003 INTEGER, col004 INTEGER, col005 INTEGER, col006 INTEGER, col007 INTEGER, col008 INTEGER, col009 INTEGER, col010 INTEGER);INSERT INTO test(col001) VALUES(1);INSERT INTO test(col002) VALUES(1);INSERT INTO test(col005) VALUES(1);INSERT INTO test(col009) VALUES(1);INSERT INTO test VALUES (NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
SELECTCASE ROW_NUMBER() OVER(ORDER BY ordinal_position)WHEN 1 THEN'SELECT'+CHAR(10)+'  *'+CHAR(10)+'FROM test'+CHAR(10)+'WHERE 'ELSE'   OR 'END+ column_name +' IS NOT NULL'+ CASE ROW_NUMBER() OVER(ORDER BY ordinal_position DESC)WHEN 1 THENCHAR(10)+';'ELSE''ENDFROM information_schema.columnsWHERE table_schema='dbo'AND table_name = 'test'ORDER BYordinal_position;
-- the whole scenario. Works for 10 , will work for 100, too:
-- out ------------------------------------------------- out  SELECT-- out   *-- out FROM test-- out WHERE col001 IS NOT NULL-- out     OR col002 IS NOT NULL-- out     OR col003 IS NOT NULL-- out     OR col004 IS NOT NULL-- out     OR col005 IS NOT NULL-- out     OR col006 IS NOT NULL-- out     OR col007 IS NOT NULL-- out     OR col008 IS NOT NULL-- out     OR col009 IS NOT NULL-- out     OR col010 IS NOT NULL-- out ;

简单且不需要sys变量:

SHOW COLUMNS FROM suppliers;

您可以尝试使用:-

USE db_name;DESCRIBE table_name;

它将为您提供带有类型的列名。

尝试使用:“DescTable_name”唯一的问题是它还会提供其他细节,例如Is Null、Type和约束

这对我有用

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'tableName';

在SQL服务器中,您可以从INFORMATION_SCHEMA.COLUMNS中选择COLUMN_NAME。

以下是代码:

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='YourTableName'

在postgres

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=<'table_name'>

注意:将table_name作为字符串传递。