Sql 访问数据库元数据

Sql 访问数据库元数据,sql,sql-server,database,sql-server-2008,metadata,Sql,Sql Server,Database,Sql Server 2008,Metadata,我遇到了一个棘手的问题。我有一个使用MicrosoftSQLS2008的数据库,在这个数据库中有许多表。这些表是自动生成的,没有有意义的名称。我需要一张特别的桌子,但我似乎找不到 我知道表中一些列的名称。是否有一种方法可以让我一次浏览所有的表,查看列的名称,看看它们是否与我知道的匹配 如果他们这样做了,那么我可以在桌子上看得更远,看看它是否就是我要找的那个。这听起来是解决问题的好方法吗?可能吗?你知道从哪里开始吗 SELECT OBJECT_SCHEMA_NAME([object_id]),

我遇到了一个棘手的问题。我有一个使用MicrosoftSQLS2008的数据库,在这个数据库中有许多表。这些表是自动生成的,没有有意义的名称。我需要一张特别的桌子,但我似乎找不到

我知道表中一些列的名称。是否有一种方法可以让我一次浏览所有的表,查看列的名称,看看它们是否与我知道的匹配

如果他们这样做了,那么我可以在桌子上看得更远,看看它是否就是我要找的那个。这听起来是解决问题的好方法吗?可能吗?你知道从哪里开始吗

SELECT OBJECT_SCHEMA_NAME([object_id]),
    OBJECT_NAME([object_id]) 
    FROM sys.columns 
    WHERE name IN ('column 1', 'column 2' 
    /* , ... other columns */);
如果OP旨在识别所有与任何:

SELECT OBJECT_SCHEMA_NAME([object_id), name 
FROM sys.tables AS t
WHERE EXISTS 
(
    SELECT 1 FROM sys.columns
    WHERE name = 'column 1'
    AND [object_id] = t.[object_id]
)
AND EXISTS 
(
    SELECT 1 FROM sys.columns
    WHERE name = 'column 2'
    AND [object_id] = t.[object_id]
)
/* ... repeat for other columns ... */

Aaron回答的替代方法是使用信息_schema.columns而不是sys.columns

SELECT Table_name
FROM 
      information_schema.columns
WHERE 
      column_name IN ('column 1', 'column 2')
GROUP BY Table_Name
Having COUNT(column_name) = 2

请参见下面的工作示例

使用上面的脚本,您仅限于SQL wild carding,这可能非常有限。您可以使用grep使用正则表达式在数据库中进行更强大的搜索。SchemaCrawler还允许您使用其他功能查找与外键相关的表,例如,您可以说find me all tables(查找所有具有customer address列的表)以及引用这些表的表。SchemaCrawler是一个与Microsoft SQL Server数据库驱动程序捆绑在一起的命令行工具


Sualeh Fatehi,

这不会返回包含
第1列
第2列
的表吗?是的,但与编写一个包含所有已知列名的查询相比,这是一个非常快速的开始。这应该可以很快缩小范围……一般来说,我建议不要使用
信息\u模式
视图@亚伦:我同意,但我喜欢在工具箱里放尽可能多的工具。同样在这种情况下(查看表名和列名),我看不出有什么令人信服的理由对ANSI标准视图进行打折,因为这更关乎一致性。例如,如果不能将
信息\u SCHEMA
用于索引,甚至不能使用关于表或列的更丰富信息,为什么要将它们用于任务的一个子集,而必须将其余部分切换到目录视图?