ChatGPT解决这个技术问题 Extra ChatGPT

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

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

甲骨文

MySQL

PostgreSQL

但我还需要知道:如何在 Microsoft SQL Server(在我的情况下为 2008)中做到这一点?

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

L
Luke Burns

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

此示例查询:

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

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

CHECK_CONSTRAINTS

COLUMN_DOMAIN_USAGE

COLUMN_PRIVILEGES

CONSTRAINT_COLUMN_USAGE

CONSTRAINT_TABLE_USAGE

DOMAIN_CONSTRAINTS

KEY_COLUMN_USAGE

参数

REFERENTIAL_CONSTRAINTS

例行公事

ROUTINE_COLUMNS

图式

TABLE_CONSTRAINTS

TABLE_PRIVILEGES

表格

VIEW_COLUMN_USAGE

VIEW_TABLE_USAGE

意见


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

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

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


h
harshit
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
d
doğukan

您可以在 SQL Server 2008 中使用 sp_help

sp_help <table_name>;

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


这是我一直以来最喜欢的键盘快捷键。我还将 sp_helptext 分配给 Cntl-F1。这两个快捷方式一起节省了很多时间!
S
Sachin Parse

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

SHOW COLUMNS FROM database_Name.table_name;

@Benjamin,因为这个问题是针对 SQL Server 而这个答案是针对 MySql
可能大部分使用MySql的人,都面临这个问题。我已经提到过。我正在使用 MySql。
大多数使用其他 RDBMS 的人是否有同样的问题并不重要,它与原始问题无关,并将相关答案进一步向下推。
我投了反对票,因为这个问题专门针对 mssql
F
Fabien TheSolution

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

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

d
doğukan
SELECT name
FROM sys.columns
WHERE object_id = OBJECT_ID('TABLE_NAME')

TABLE_NAME 是您的桌子


d
doğukan
--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

T
Taryn
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

i
ishaan arora

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

desc <TABLE NAME> ;

我知道这在 Oracle 中有效。但这在 Microsft SQL 中有效吗?谢谢你。
这个解决方案是最简单的,应该更高
E
Eray Balkanli

只需运行此命令

EXEC sp_columns 'Your Table Name'

它没有给出预期的结果
S
Shreekant

总结答案

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

N
NeverHopeless

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

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

P
Prahalad Gaggar

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

r
reza akhlaghi

你可以使用这个查询

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

k
k06a
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

o
officialrahulmandal

您可以尝试使用:-

USE db_name;
DESCRIBE table_name;

它会给你类型的列名。


S
Samuel Nde

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

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

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


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

其他答案是一样的。
H
Hawkzey
SELECT TOP (0) [toID]
      ,[sourceID]
      ,[name]
      ,[address]
  FROM [ReportDatabase].[Ticket].[To]

简单且不需要任何系统表


m
marcothesane

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


k
khalandar bankapur

简单且不需要 sys 变量:

SHOW COLUMNS FROM suppliers;

mysql 版本 5.7.33。它不起作用
A
Atul Sharma

尝试使用:“desc Table_name”唯一的事情是它会提供其他详细信息,例如,是空的,类型和约束


M
Mina Ayad

这对我有用

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