【问题标题】:How do you return the column names of a table?如何返回表的列名?
【发布时间】:2010-10-10 16:04:42
【问题描述】:

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

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    这样的?

    sp_columns @table_name=your table name
    

    【讨论】:

      【解决方案2】:

      不确定 2008 版是否有更简单的方法。

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

      【讨论】:

      • 什么是'YourSchemaName'?
      • 'YourSchemaName' 是您要查询的表的架构。示例:dbo.myTable,'dbo' 是 'myTable' 所属的架构。架构使为分组而不是单独分配每个表的权限更容易。也看到这个问题:stackoverflow.com/questions/1062075/…
      • 不要忘记使用 USE DatabaseName 命令,否则您可以在主数据库或其他数据库中搜索而不是您想要的
      • SELECT COLUMN_NAME,* FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'YourTableName' AND TABLE_SCHEMA='dbo'
      【解决方案3】:

      一种方法是查询系统列:

      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
      

      【讨论】:

      • 完整写出join不是更好吗(sysobjects so inner join syscolumns sc on so.id = sc.id)?这似乎是一个以牺牲性能为代价的懒惰答案。我可能是错的......
      • @Losbear 更改了它 PS:不是懒惰,它只是 8 年前的代码。 :) 在过去(我从 4.2 版开始使用 SQL Server),我曾经以这种方式编写 SQL 查询。没有性能问题。
      【解决方案4】:

      我不确定 syscolumns.colid 值是否与作为 sp_columns 的一部分返回的 'ORDINAL_POSITION' 值相同,但接下来我就是这样使用它的 - 希望我没有误导...

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

      sp_columns 返回一大堆无关紧要的东西,而且我使用 select 比 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。据说模式和存储过程方法更能证明这一点......不确定,但到目前为止还不错。
      【解决方案5】:
      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
      

      【讨论】:

      • 欢迎来到 SO!但看起来这个问题在大约三年前已经得到了令人满意的答案......另外,在发布代码时,使用 {} 突出显示它。看看常见问题解答,这里有一些很好的入门信息:stackoverflow.com/faq
      【解决方案6】:

      这是最简单的方法

      exec sp_columns [tablename]
      

      【讨论】:

      • 如果您的架构不是 dbo,则必须将其作为附加参数传递。 exec sp_columns [TableName], @table_owner = [schema]
      【解决方案7】:

      为什么不试试这个:

      右键单击表格 -> 将表格编写为 -> 创建到 -> 新建查询编辑器 窗户?

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

      【讨论】:

      • 作者可能想知道如何以编程方式从表中获取列名,以便在存储过程或其他脚本中使用。
      • 答案状态为"I want to return these as data",虽然您的答案会得到值,但很可能 OP 在运行时需要数据。
      【解决方案8】:

      我用

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

      【讨论】:

        【解决方案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
        

        【讨论】:

          【解决方案10】:
          set fmtonly on
          select * from yourTable
          

          【讨论】:

            【解决方案11】:

            我只是使用像 Martin Smith 提到的查询,只是更短一点:

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

            【讨论】:

              【解决方案12】:

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

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

              【讨论】:

                【解决方案13】:

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

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

                【讨论】:

                  【解决方案14】:

                  USE[Database] SELECT TABLE_NAME,TABLE_SCHEMA,[Column_Name],[Data_type] FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='dbo'

                  【讨论】:

                    【解决方案15】:
                    SELECT *
                    FROM INFORMATION_SCHEMA.COLUMNS
                    WHERE TABLE_NAME = N'TableName'
                    

                    【讨论】:

                      【解决方案16】:

                      由于SysColumns is deprecated,使用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

                      【讨论】:

                        【解决方案17】:

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

                            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"; } }
                        
                         } 
                        

                        【讨论】:

                          【解决方案18】:

                          试试这个

                          select * from <tablename> where 1=2
                          

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

                          【讨论】:

                          • 很有意思,但背后的逻辑是什么?
                          • @nilakanthasinghdeo,逻辑是它总是返回零行和WHERE 1=2,它仍然会返回列元数据。如果使用诸如 ODBC 之类的编程接口,则可以从程序中的游标对象中以列表/数组的形式访问此列信息,这正是我所寻找的。它在纯 SQL 上下文中可能没有意义,但在通过 Python/Java/C/等连接到数据库时是一种简洁的方法。
                          【解决方案19】:
                          DECLARE @col NVARCHAR(MAX);
                          SELECT @col= COALESCE(@col, '') + ',' + COLUMN_NAME
                          FROM INFORMATION_SCHEMA.COLUMNS WHERE  Table_name = 'MxLocations';
                          SELECT @col;
                          

                          【讨论】:

                            【解决方案20】:

                            如果您使用的是 postgresql,那么在这种情况下,可能会有多个架构具有相同名称的表,请应用以下查询

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

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 2015-03-18
                              • 1970-01-01
                              • 1970-01-01
                              • 2018-06-19
                              • 1970-01-01
                              • 1970-01-01
                              • 2020-10-22
                              • 2019-03-07
                              相关资源
                              最近更新 更多