如何返回表的列名?


239

如何使用SQL Server 2008返回表的列名?即一个表包含这些列-id,名称,地址,国家/地区,我想将它们作为数据返回。

Answers:


399

不知道在2008版本中是否有更简单的方法。

USE [Database Name]
SELECT COLUMN_NAME,* 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTableName' AND TABLE_SCHEMA='YourSchemaName'

6
什么是“ YourSchemaName”?
德鲁丁

12
“ YourSchemaName”是您要查询的表的架构。示例:dbo.myTable,“ dbo”是“ myTable”所属的架构。使用架构,可以更轻松地将权限分配给分组,而不必分别分配每个表。看到这个问题太:stackoverflow.com/questions/1062075/...
jmosesman

3
不要忘记使用USE DatabaseName命令,否则您可以在主数据库或与您想要的数据库不同的数据库中进行搜索
Muflix 2015年

1
从INFORMATION_SCHEMA.COLUMNS中选择SELECT COLUMN_NAME,*在TABLE_NAME ='YourTableName'和TABLE_SCHEMA ='dbo'–
乌斯曼·尤纳斯

112

这是最简单的方法

exec sp_columns [tablename]

2
这很简单,应该是正确的答案。我
想当

1
如果您的架构不是dbo,则必须将其作为附加参数传递。exec sp_columns [TableName],@ table_owner = [schema]
Pradeep,


13

一种方法是查询syscolumns:

select
   syscolumns.name as [Column],
   syscolumns.xusertype as [Type],
   sysobjects.xtype as [Objtype]
from 
   sysobjects 
inner join 
   syscolumns on sysobjects.id = syscolumns.id
where sysobjects.xtype = 'u'
and   sysobjects.name = 'MyTableName'
order by syscolumns.name

1
我真的很喜欢这一个。我发现Objtype列是多余的,但:)
Joel

1
完全写出联接(sysobjects,以便将内部联接syscolumns sc放在so.id = sc.id上)会更好吗?这似乎是一个懒惰的答案,但会降低性能。我可能错了……
Losbear

1
@Losbear更改了它PS:不懒惰,它只是8年前的代码。:)在过去(我使用的SQL Server从版本4.2开始),我曾经以这种方式编写SQL查询。没有性能问题。
splattne

9

这似乎比上面的建议要容易一些,因为它使用OBJECT_ID()函数来查找表的ID。具有该ID的任何列都是表的一部分。

SELECT * 
  FROM syscolumns 
 WHERE id=OBJECT_ID('YOUR_TABLE') 

我通常使用类似的查询来查看是否存在我所知道的属于较新版本的列。这是相同的查询,在where子句中附加了{AND name ='YOUR_COLUMN'}。

IF EXISTS (
        SELECT * 
          FROM syscolumns 
         WHERE id=OBJECT_ID('YOUR_TABLE') 
           AND name='YOUR_COLUMN'
        )
BEGIN
    PRINT 'Column found'
END

8

试试这个

select * from <tablename> where 1=2

.............................................................


有趣,但是背后的逻辑是什么?
nilakantha singh deo

@nilakanthasinghdeo,逻辑是它将始终返回0行,WHERE 1=2并且仍将返回列元数据。如果使用诸如ODBC之类的编程接口,则可以从程序中的游标对象以列表/数组的形式访问此列信息,这正是我想要的。在纯SQL上下文中,这可能没有意义,但是当通过Python / Java / C / etc连接到数据库时,这是一种简洁的方法。
亚瑟·赫伯特

5

以下内容似乎与上述第一个建议的查询类似,但是有时您必须指定数据库才能使其正常工作。请注意,查询也应在不指定TABLE_SCHEMA的情况下运行:

SELECT COLUMN_NAME
FROM   YOUR_DB_NAME.INFORMATION_SCHEMA.COLUMNS
WHERE  TABLE_NAME = 'YOUR_TABLE_NAME' AND TABLE_SCHEMA = 'YOUR_DB_NAME'

4

我用

SELECT st.NAME, sc.NAME, sc.system_type_id
FROM sys.tables st
INNER JOIN sys.columns sc ON st.object_id = sc.object_id
WHERE st.name LIKE '%Tablename%'

3

为什么不试试这个:

右键单击表->脚本表为->创建至->新建查询编辑器窗口?

脚本中给出了列的完整列表。复制它并根据需要使用字段。


3
作者可能想知道如何以编程方式从表中获取列名,以用于存储过程或其他脚本中。
KLee1 2012年

1
答案指出"I want to return these as data",尽管您的答案将获得值,但OP可能希望在运行时获取数据。
StuperUser 2012年


1
CREATE PROCEDURE [dbo].[Usp_GetColumnName]      
        @TableName varchar(50)
AS
BEGIN   
    BEGIN
        SET NOCOUNT ON
        IF (@TableName IS NOT NULL) 
            select ORDINAL_POSITION OrderPosition,COLUMN_NAME ColumnName from information_schema.columns 
             where table_name =@TableName
             order by ORDINAL_POSITION
    END
END

2
欢迎来到SO!但是看起来这个问题大约在三年前就已经得到了满意的答案。此外,在发布代码时,请使用{}突出显示它。看看FAQ,这里有一些入门的好信息:stackoverflow.com/faq
Valentino Vranken

1

我不确定syscolumns.colid值是否与作为sp_columns的一部分返回的'ORDINAL_POSITION'值相同,但是在接下来的操作中,我将以这种方式使用它-希望我不要误会...

这是我发现的其他一些答案的细微变化-我使用它是因为表中列的“位置”或顺序在我的应用程序中很重要-我基本上需要知道“列(n)是什么” '

sp_columns返回了一大堆无关紧要的东西,而我比T-SQL函数更方便选择,所以我走了这条路:

select    
  syscolumns.name, 
  syscolumns.colid    
from     
  sysobjects, syscolumns  
where 
  sysobjects.id = syscolumns.id and   
  sysobjects.xtype = 'u' and   
  sysobjects.name = '<YOUR_TABLE>' 
order by syscolumns.colid 

我使用这种方法很长时间,但建议不要这样做。实际上,我遇到了一个确切的问题,即可能会告诉我...新版本的MSSQL可能会更改语法。例如,在我最初使用此技术的版本中,它曾经是sys.object和sys.columns。大概模式和存储过程方法可以更好地证明这一点……不确定,但是到目前为止还不错。
RosieC

1

虽然@Gulzar Nazim的答案很好,但在查询中包括数据库名称可能会更容易,这可以通过以下SQL来实现。

SELECT COLUMN_NAME, *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'you-table-name' AND TABLE_CATALOG='your-database-name'

1

您可以使用以下代码来打印所有列名;您还可以修改代码以使用您喜欢的任何格式打印其他详细信息

    declare @Result varchar(max)='
            '
            select @Result=@Result+''+ColumnName+'
            '
            from
            (
                select
                    replace(col.name, ' ', '_') ColumnName,
                    column_id ColumnId
                from sys.columns col
                    join sys.types typ on
                        col.system_type_id = typ.system_type_id AND col.user_type_id = typ.user_type_id
                where object_id = object_id('tblPracticeTestSections')
            ) t
            order by ColumnId
            print @Result

输出量

column1
column2
column3
column4

要使用与C#类相同的代码来打印表及其列名,请使用以下代码:

    declare @TableName sysname = '<EnterTableName>'
    declare @Result varchar(max) = 'public class ' + @TableName + '
    {'

    select @Result = @Result + '
        public static string ' + ColumnName + ' { get { return "'+ColumnName+'"; } }
    '
    from
    (
        select
            replace(col.name, ' ', '_') ColumnName,
            column_id ColumnId
        from sys.columns col
            join sys.types typ on
                col.system_type_id = typ.system_type_id AND col.user_type_id = typ.user_type_id
        where object_id = object_id(@TableName)
    ) t
    order by ColumnId

    set @Result = @Result  + '
    }'

    print @Result

输出:

 public class tblPracticeTestSections
 {
   public static string column1 { get { return "column1"; } }

   public static string column2{ get { return "column2"; } }

   public static string column3{ get { return "column3"; } }

   public static string column4{ get { return "column4"; } }

 } 



0

由于SysColumns已弃用,请使用Sys.All_Columns

Select  
 ObjectName       = Object_Name(Object_ID)  
,T.Name  
,C.*  
,T.*  
From   
           Sys.All_Columns C  
Inner Join Sys.Types       T  On T.User_Type_Id = C.User_Type_Id  
Where [Object_ID] = Object_ID('Sys.Server_Permissions')  
--Order By Name Asc  

Select * From Sys.Types将产生 user_type_id = ID该类型。这在数据库中是唯一的。对于系统数据类型:user_type_id = system_type_id


0
DECLARE @col NVARCHAR(MAX);
SELECT @col= COALESCE(@col, '') + ',' + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS WHERE  Table_name = 'MxLocations';
SELECT @col;

0

如果您使用的是postgresql,则在这种情况下,可能有多个模式具有相同名称的表,请应用以下查询

SELECT column_name, data_type 
FROM information_schema.columns
WHERE table_name = 'your_table_name' AND table_schema = 'your_schema_name’;

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.