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

时间:2009-06-28 14:05:50

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

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

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

21 个答案:

答案 0 :(得分:722)

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

此示例查询:

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

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

答案 1 :(得分:181)

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

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

答案 2 :(得分:136)

select *
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='tableName'

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

答案 3 :(得分:51)

您可以在SQL Server 2008中使用sp_help

sp_help <table_name>;

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

答案 4 :(得分:42)

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

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

答案 5 :(得分:31)

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

SHOW COLUMNS FROM database_Name.table_name;

答案 6 :(得分:24)

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

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

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

答案 7 :(得分:18)

SELECT name
FROM sys.columns
WHERE object_id = OBJECT_ID('TABLE_NAME')

// TABLE_NAME是你的表

答案 8 :(得分: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

答案 9 :(得分:11)

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

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

答案 10 :(得分:11)

您可以尝试此操作。这会为所有列名称提供各自的数据类型。

$replace = [];
foreach ($array_of_strings as $string) {
    $replace[$string] = "<p>$string</p>";
}

echo strtr($text, $replace);

答案 11 :(得分:10)

只需运行此命令

EXEC sp_columns 'Your Table Name'

答案 12 :(得分:9)

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

答案 13 :(得分:5)

您可以使用此查询

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

答案 14 :(得分:4)

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

答案 15 :(得分:3)

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

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

这使您在同一列中拥有所有列名。 如果您关心其他元数据,则可以将SELECT STATEMENT更改为SELECT *

答案 16 :(得分:2)

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

答案 17 :(得分:0)

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

简单且不需要任何sys表

答案 18 :(得分:0)

总结答案

我可以看到许多不同的答案和执行此操作的方法,但是其中有一个难题,那就是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]'

答案 19 :(得分:0)

一些生成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 ;

答案 20 :(得分:0)

简单且不需要 sys 变量:

SHOW COLUMNS FROM suppliers;