【问题标题】:How can I get column names from a table in SQL Server?如何从 SQL Server 中的表中获取列名?
【发布时间】:2010-11-06 12:00:26
【问题描述】:

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

但我还需要知道:如何在 Microsoft SQL Server(在我的例子中是 2008 年)中做到这一点?

【问题讨论】:

  • 作为一个快速而肮脏的技巧,我真的很喜欢SELECT * FROM my_table WHERE 1=0
  • @bgusach - 似乎用户希望将列的名称作为表中的行,但是对于您要执行的操作,SELECT TOP 0 * FROM my_table 的击键次数更少

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

您可以通过查询Information Schema views 获取此信息以及更多信息。

这个示例查询:

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

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

【讨论】:

  • “= N'Customers'”中的“N”代表什么?
  • Qbik "N" if 用于处理 ANSI(32 位)中的 varchar 和 unicode(64 位)中的 nvarchar 等 unicode 字符串
  • 确认:也适用于 MariaDB ! :)(没有Nortwind. ...)
  • SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'tableName'; 这对我有用
  • 我必须使用TABLE_SCHEMA = '?' AND TABLE_NAME = '?',因为我在本地主机上,并且我有多个同名但在不同数据库中的表。
【解决方案2】:

您可以使用存储过程 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

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

【讨论】:

    【解决方案3】:
    select *
    from INFORMATION_SCHEMA.COLUMNS
    where TABLE_NAME='tableName'
    

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

    【讨论】:

    • +1 因为这是标准的 ANSI SQL (en.wikipedia.org/wiki/Information_schema) sys.objects 等其他答案不是标准的
    • 如果表在另一个模式中(SQL 服务器“模式”变体),在WHERE 子句中添加AND TABLE_SCHEMA = 'schemaName'
    • 非常有用,您可以在 'SELECT' 语句中添加 JOIN sys.types t on c.system_type_id = t.system_type_idt.name 以获取每个列名称旁边的 types。跨度>
    【解决方案4】:

    您可以在 SQL Server 2008 中使用sp_help

    sp_help <table_name>;
    

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

    【讨论】:

    • 这是我一直以来最喜欢的键盘快捷键。我还将 sp_helptext 分配给 Cntl-F1。这两个快捷键一起节省了很多时间!
    【解决方案5】:

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

    select Column_name 
    from Information_schema.columns 
    where Table_name like 'table name'
    

    【讨论】:

      【解决方案6】:

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

      SHOW COLUMNS FROM database_Name.table_name;
      

      【讨论】:

      • @Benjamin,因为这个问题是针对 SQL Server 而这个答案是针对 MySql
      • 可能是大多数使用MySql的人,都面临这个问题。我已经提到过。我正在使用 MySql。
      • 大多数使用其他RDBMS的人是否有同样的问题并不重要,它与原始问题无关,并将相关答案进一步向下推。
      • 我投反对票,因为这个问题专门针对 mssql
      【解决方案7】:
      SELECT name
      FROM sys.columns
      WHERE object_id = OBJECT_ID('TABLE_NAME')
      

      TABLE_NAME 是你的餐桌

      【讨论】:

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

        【讨论】:

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

          【讨论】:

            【解决方案10】:

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

            desc <TABLE NAME> ;
            

            【讨论】:

            • 我知道这适用于 Oracle。但这在 Microsft SQL 中有效吗?谢谢。
            • 这个方案最简单,应该更高
            【解决方案11】:

            只要运行这个命令

            EXEC sp_columns 'Your Table Name'
            

            【讨论】:

            • 它没有给出想要的结果
            【解决方案12】:

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

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

            【讨论】:

              【解决方案13】:

              它会检查给定的table是否是Base 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'
              

              【讨论】:

                【解决方案14】:

                总结答案

                我可以看到许多不同的答案和方法来做到这一点,但其中有一个问题,那就是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]'
                

                【讨论】:

                  【解决方案15】:

                  你可以使用这个查询

                  SELECT *
                  FROM INFORMATION_SCHEMA.COLUMNS
                  WHERE COLUMN_NAME like N'%[ColumnName]%' and TABLE_NAME = N'[TableName]'
                  

                  【讨论】:

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

                    【讨论】:

                      【解决方案17】:

                      另一个更直观的选择是:

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

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

                      【讨论】:

                        【解决方案18】:

                        您可以尝试使用:-

                        USE db_name;
                        DESCRIBE table_name;
                        

                        它会给你列名和类型。

                        【讨论】:

                          【解决方案19】:
                          SELECT COLUMN_NAME
                          FROM INFORMATION_SCHEMA.COLUMNS
                          WHERE TABLE_NAME = 'name_of_your_table'
                          

                          【讨论】:

                          • 其他答案同理。
                          【解决方案20】:
                          SELECT TOP (0) [toID]
                                ,[sourceID]
                                ,[name]
                                ,[address]
                            FROM [ReportDatabase].[Ticket].[To]
                          

                          简单且不需要任何系统表

                          【讨论】:

                            【解决方案21】:

                            一些 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);
                            
                            SELECT
                              CASE 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 THEN 
                                CHAR(10)+';'
                              ELSE
                                ''
                              END
                              FROM information_schema.columns
                              WHERE table_schema='dbo'
                                AND table_name = 'test'
                            ORDER BY
                              ordinal_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 ;
                            
                            

                            【讨论】:

                              【解决方案22】:

                              简单且不需要 sys 变量:

                              SHOW COLUMNS FROM suppliers;
                              

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2015-04-27
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多