【发布时间】:2010-10-10 16:04:42
【问题描述】:
如何使用 SQL Server 2008 返回表的列名?即一个表包含这些列 - id、名称、地址、国家,我想将这些作为数据返回。
【问题讨论】:
标签: sql sql-server tsql
如何使用 SQL Server 2008 返回表的列名?即一个表包含这些列 - id、名称、地址、国家,我想将这些作为数据返回。
【问题讨论】:
标签: sql sql-server tsql
这样的?
sp_columns @table_name=your table name
【讨论】:
不确定 2008 版是否有更简单的方法。
USE [Database Name]
SELECT COLUMN_NAME,*
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTableName' AND TABLE_SCHEMA='YourSchemaName'
【讨论】:
一种方法是查询系统列:
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
【讨论】:
我不确定 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
【讨论】:
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
【讨论】:
这是最简单的方法
exec sp_columns [tablename]
【讨论】:
为什么不试试这个:
右键单击表格 -> 将表格编写为 -> 创建到 -> 新建查询编辑器 窗户?
脚本中给出了完整的列列表。复制它并根据需要使用字段。
【讨论】:
"I want to return these as data",虽然您的答案会得到值,但很可能 OP 在运行时需要数据。
我用
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%'
【讨论】:
这似乎比上面的建议更容易,因为它使用 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
【讨论】:
set fmtonly on
select * from yourTable
【讨论】:
我只是使用像 Martin Smith 提到的查询,只是更短一点:
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTableName'
【讨论】:
以下似乎与上面第一个建议的查询类似,但有时您必须指定数据库才能使其工作。请注意,查询也应该在不指定 TABLE_SCHEMA 的情况下工作:
SELECT COLUMN_NAME
FROM YOUR_DB_NAME.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YOUR_TABLE_NAME' AND TABLE_SCHEMA = 'YOUR_DB_NAME'
【讨论】:
虽然@Gulzar Nazim 的回答很棒,但在查询中包含数据库名称 可能更容易,这可以通过以下 SQL 来实现。
SELECT COLUMN_NAME, *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'you-table-name' AND TABLE_CATALOG='your-database-name'
【讨论】:
USE[Database]
SELECT TABLE_NAME,TABLE_SCHEMA,[Column_Name],[Data_type]
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA='dbo'
【讨论】:
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'TableName'
【讨论】:
由于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。
【讨论】:
您可以使用以下代码打印所有列名;您还可以修改代码以您喜欢的任何格式打印其他详细信息
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"; } }
}
【讨论】:
试试这个
select * from <tablename> where 1=2
..................................................
【讨论】:
WHERE 1=2,它仍然会返回列元数据。如果使用诸如 ODBC 之类的编程接口,则可以从程序中的游标对象中以列表/数组的形式访问此列信息,这正是我所寻找的。它在纯 SQL 上下文中可能没有意义,但在通过 Python/Java/C/等连接到数据库时是一种简洁的方法。
DECLARE @col NVARCHAR(MAX);
SELECT @col= COALESCE(@col, '') + ',' + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS WHERE Table_name = 'MxLocations';
SELECT @col;
【讨论】:
如果您使用的是 postgresql,那么在这种情况下,可能会有多个架构具有相同名称的表,请应用以下查询
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = 'your_table_name' AND table_schema = 'your_schema_name’;
【讨论】: