获取数据库中每个表和字段的列表

107
我正在考虑创建一个基本的ORM(纯粹出于兴趣),想知道是否有一种方法可以返回数据库中表格的列表以及每个表格的字段?
使用这个,我想能够遍历结果集(在C#中),然后对于结果集中的每个表,执行这个操作(例如使用反射来制作做或包含xyz的类)。
此外,有哪些关于SQL Server的好的在线博客? 我知道这个问题实际上是关于在Sql Server中使用系统SP和数据库的,我对通用查询很熟悉,所以我对涵盖这种功能的博客很感兴趣。
谢谢

请查看我的博客中的这篇文章:http://dbalink.wordpress.com/2009/01/07/todays-link-sql-server-blog-list/,关于 SQL Server 博客列表。 - MarlonRibunal
请参考相关问题:https://dev59.com/1XVC5IYBdhLWcg3w0EoD - Ray
1
谢谢。这个任务可以使用C#完成。 - GurdeepS
14个回答

193

您需要的是这个吗:

使用对象目录视图

 SELECT T.name AS Table_Name ,
       C.name AS Column_Name ,
       P.name AS Data_Type ,
       C.max_length AS Size ,
       CAST(P.precision AS VARCHAR) + '/' + CAST(P.scale AS VARCHAR) AS Precision_Scale
FROM   sys.objects AS T
       JOIN sys.columns AS C ON T.object_id = C.object_id
       JOIN sys.types AS P ON C.system_type_id = P.system_type_id
WHERE  T.type_desc = 'USER_TABLE';

使用 INFORMATION SCHEMA 视图

  SELECT TABLE_SCHEMA ,
       TABLE_NAME ,
       COLUMN_NAME ,
       ORDINAL_POSITION ,
       COLUMN_DEFAULT ,
       DATA_TYPE ,
       CHARACTER_MAXIMUM_LENGTH ,
       NUMERIC_PRECISION ,
       NUMERIC_PRECISION_RADIX ,
       NUMERIC_SCALE ,
       DATETIME_PRECISION
FROM   INFORMATION_SCHEMA.COLUMNS;

参考:我的博客-http://dbalink.wordpress.com/2008/10/24/querying-the-object-catalog-and-information-schema-views/

本文介绍如何查询对象目录和信息架构视图。在IT技术领域,这是一个非常实用的功能。通过查询对象目录和信息架构视图,您可以获取有关数据库中对象的详细信息,包括表、列、过程等。 在此过程中,请确保严格按照格式要求并保留HTML标记。

9
第一个查询始终返回char的maxlength=8000,这是不正确的。第二个查询是正确的,更加详细。 - smirkingman
1
两个查询返回的行数不同:/ - GorvGoyl
INFORMATION_SCHEMA 方法的一个优点是它在不同的数据库之间非常易于移植。 - j_random_hacker
1
那是打字错误吗?我会使用 C.max_length AS Size , - 否则您最终将得到 maxlength = 8000,就像 @smirkingman 提到的那样。 - mbx
10年前的问题仍然有价值。感谢提问和回答! - Mike Marshall
显示剩余3条评论

43

表格 ::

SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'

列 ::

SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
或者
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='your_table_name'

8
INFORMATION_SCHEMA 的好处是它不仅限于 SQL Server,而是符合 ISO 标准。相同的代码可以用于所有符合标准的数据库。 - cindi
非常有用...但是如何在上面的表达式中包含数据库名称?提前致谢。 - Amit Verma
@AmitVerma USE <你的数据库名称>; SELECT * FROM INFORMATION_SCHEMA.COLUMNS (至少是 MS SQL 语法) - Chris O

16

获取数据库中所有表和字段的列表:

Select *
From INFORMATION_SCHEMA.COLUMNS
Where TABLE_CATALOG Like 'DatabaseName'

获取表中所有字段的列表:

Select *
From INFORMATION_SCHEMA.COLUMNS
Where TABLE_CATALOG Like 'DatabaseName' And TABLE_NAME Like 'TableName' 

INFORMATION_SCHEMA方法的一个优点是它在不同的数据库之间非常便携。 - j_random_hacker

9

我测试了几个解决方案,发现

Select *
From INFORMATION_SCHEMA.COLUMNS

此命令将为您的当前/默认数据库提供列信息。

Select *
From <DBNAME>.INFORMATION_SCHEMA.COLUMNS

不带<和>,可以为数据库DBNAME提供列信息。


8
SELECT * FROM INFORMATION_SCHEMA.COLUMNS

3

你的另一个内置朋友是系统存储过程SP_HELP。

使用示例:

sp_help <MyTableName>

它返回的信息可能比你实际需要的多得多,但至少满足了你可能需要的90%。

1

SELECT * FROM INFORMATION_SCHEMA.COLUMNS是用于获取所有列的。

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS是用于获取所有表名的。 可以在sqlserver上尝试一下。


1

这将获取所有用户创建的表:

select * from sysobjects where xtype='U'

获取列:
Select * from Information_Schema.Columns Where Table_Name = 'Insert Table Name Here'

另外,我发现http://www.sqlservercentral.com/是一个相当不错的数据库资源。


0

这将返回由数据库参数指定的数据库名称、表名称、列名称和列数据类型:

declare @database nvarchar(25)
set @database = ''

SELECT cu.table_catalog,cu.VIEW_SCHEMA, cu.VIEW_NAME, cu.TABLE_NAME,   
cu.COLUMN_NAME,c.DATA_TYPE,c.character_maximum_length
from INFORMATION_SCHEMA.VIEW_COLUMN_USAGE as cu
JOIN INFORMATION_SCHEMA.COLUMNS as c
on cu.TABLE_SCHEMA = c.TABLE_SCHEMA and c.TABLE_CATALOG = 
cu.TABLE_CATALOG
and c.TABLE_NAME = cu.TABLE_NAME
and c.COLUMN_NAME = cu.COLUMN_NAME
where cu.TABLE_CATALOG = @database
order by cu.view_name,c.COLUMN_NAME

对于所有的Views,此列表列出了视图返回的每个列的表名、列名、数据类型和长度。这并不能回答问题,但是这是一个很好的查询。 - Ben

0

我只是随便说一下 - 现在很容易复制/粘贴到Word或Google文档中:

PRINT '<html><body>'
SET NOCOUNT ON
DECLARE @tableName VARCHAR(30)
DECLARE tableCursor CURSOR LOCAL FAST_FORWARD FOR
    SELECT T.name AS TableName 
      FROM sys.objects AS T
     WHERE T.type_desc = 'USER_TABLE'
     ORDER BY T.name
OPEN tableCursor
FETCH NEXT FROM tableCursor INTO @tableName
WHILE @@FETCH_STATUS = 0 BEGIN
    PRINT '<h2>' + @tableName + '</h2>'
    PRINT '<pre>'
    SELECT LEFT(C.name, 30) AS ColumnName,
           LEFT(ISC.DATA_TYPE, 10) AS DataType,
           C.max_length AS Size,
           CAST(P.precision AS VARCHAR(4)) + '/' + CAST(P.scale AS VARCHAR(4)) AS PrecScale,
           CASE WHEN C.is_nullable = 1 THEN 'Null' ELSE 'No Null' END AS [Nullable],
           LEFT(ISNULL(ISC.COLUMN_DEFAULT, ' '), 5)  AS [Default],
           CASE WHEN C.is_identity = 1 THEN 'Identity' ELSE '' END AS [Identity]
    FROM   sys.objects AS T
           JOIN sys.columns AS C ON T.object_id = C.object_id
           JOIN sys.types AS P ON C.system_type_id = P.system_type_id
           JOIN INFORMATION_SCHEMA.COLUMNS AS ISC ON T.name = ISC.TABLE_NAME AND C.name = ISC.COLUMN_NAME
    WHERE  T.type_desc = 'USER_TABLE'
      AND  T.name = @tableName
    ORDER BY T.name, ISC.ORDINAL_POSITION
    PRINT '</pre>'
    FETCH NEXT FROM tableCursor INTO @tableName

END

CLOSE tableCursor
DEALLOCATE tableCursor
SET NOCOUNT OFF
PRINT '</body></html>'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接