我想查询一个表的所有列的名称。我发现如何做到这一点:
甲骨文
MySQL
PostgreSQL
但我还需要知道:如何在 Microsoft SQL Server(在我的情况下为 2008)中做到这一点?
SELECT * FROM my_table WHERE 1=0
SELECT TOP 0 * FROM my_table
击键次数较少
您可以通过查询 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
意见
您可以使用存储过程 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
这会从所有表中获取所有列,按表名排序,然后按列名排序。
select *
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='tableName'
这比从 sys.columns
获取要好,因为它直接显示 DATA_TYPE
。
WHERE
子句中添加 AND TABLE_SCHEMA = 'schemaName'
。
JOIN sys.types t on c.system_type_id = t.system_type_id
和 t.name
以获取每个列名称旁边的 types。
您可以在 SQL Server 2008 中使用 sp_help
。
sp_help <table_name>;
上述命令的键盘快捷键:选择表名(即突出显示它)并按 ALT+F1。
您可以编写此查询以获取列名和所有详细信息,而无需在 MySql 中使用 INFORMATION_SCHEMA :
SHOW COLUMNS FROM database_Name.table_name;
通过使用此查询,您将得到答案:
select Column_name
from Information_schema.columns
where Table_name like 'table name'
SELECT name
FROM sys.columns
WHERE object_id = OBJECT_ID('TABLE_NAME')
TABLE_NAME
是您的桌子
--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
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
你可以试试这个。这会给出所有列名及其各自的数据类型。
desc <TABLE NAME> ;
只需运行此命令
EXEC sp_columns 'Your Table Name'
总结答案
我可以看到许多不同的答案和方法来做到这一点,但其中有一个问题,那就是 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]'
这个 SO 问题缺少以下方法:
-- List down all columns of table 'Logging'
select * from sys.all_columns where object_id = OBJECT_ID('Logging')
它将检查给定的 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'
你可以使用这个查询
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME like N'%[ColumnName]%' and TABLE_NAME = N'[TableName]'
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
您可以尝试使用:-
USE db_name;
DESCRIBE table_name;
它会给你类型的列名。
可以说更直观的另一种选择是:
SELECT [name]
FROM sys.columns
WHERE object_id = OBJECT_ID('[yourSchemaType].[yourTableName]')
这会在单个列中为您提供所有列名。如果您关心其他元数据,可以将编辑 SELECT STATEMENT 更改为 SELECT *
。
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'name_of_your_table'
SELECT TOP (0) [toID]
,[sourceID]
,[name]
,[address]
FROM [ReportDatabase].[Ticket].[To]
简单且不需要任何系统表
一些 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 ;
简单且不需要 sys 变量:
SHOW COLUMNS FROM suppliers;
尝试使用:“desc Table_name”唯一的事情是它会提供其他详细信息,例如,是空的,类型和约束
这对我有用
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'tableName';
不定期副业成功案例分享
Nortwind.
...)SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'tableName';
这对我有用TABLE_SCHEMA = '?' AND TABLE_NAME = '?'
因为我在本地主机上并且我有多个同名但在不同数据库中的表。