2011-09-06 96 views
1

我遇到了一个棘手的问题。我有一个使用Microsoft SQL 2008的数据库,在这个数据库中有很多表。这些表格是自动生成的,没有有意义的名称。我需要一个特定的表格,而且我似乎无法找到它。访问数据库元数据

我知道表中一些列的名称被调用。有没有办法让我可以一次一个地查看所有表格,查看列的名称,并查看它们是否与我所知道的相匹配。

如果他们这样做,那么我可以看看更远的表,看看它是否是我正在寻找的。这听起来像是解决问题的好方法吗?可能吗?任何想法从哪里开始?

回答

2
SELECT OBJECT_SCHEMA_NAME([object_id]), 
    OBJECT_NAME([object_id]) 
    FROM sys.columns 
    WHERE name IN ('column 1', 'column 2' 
    /* , ... other columns */); 

编辑的要求,在案件意味着OP为ALL识别与ANY:使用INFORMATION_SCHEMA.COLUMNS代替SYS.COLUMNS的

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 ... */ 
+0

不会与'列1'或者'列2'而不是两个是回报率表吗? –

+0

是的,但与编写一个能够查找带* ALL *个已知列名的表的查询相比,这是一个非常快速的开始。这应该很快缩小它的范围...... –

1

替代阿龙的回答

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

看到这个Data.SE query为一个工作示例

+0

一般来说,我建议不要用'INFORMATION_SCHEMA'视图。 http://stackoverflow.com/questions/7217886/unreliable-information-schema-schema-information-on-sql-server/7310746#7310746 –

+0

@Aaron我同意,但我喜欢尽可能多的工具在我的工具箱中尽可能。同样在这种情况下(查看表格和列名称),我没有看到令人信服的理由来折扣ANSI标准视图 –

+0

不,它更关注一致性。如果你不能为索引使用'INFORMATION_SCHEMA',或者甚至不能使用'INFORMATION_SCHEMA'或更多关于表或列的更丰富的信息,为什么将它们用于你的任务子集并且必须切换到其余的目录视图? –

0

使用上面的脚本,您仅限于SQL通配,这可能非常有限。您可以使用SchemaCrawler grep使用正则表达式更有效地搜索数据库。 SchemaCrawler还允许您使用其他功能来查找与外键相关的表,例如,您可以说找到包含客户地址列的所有表以及引用这些表的表。 SchemaCrawler是一个与Microsoft SQL Server数据库驱动程序捆绑在一起的命令行工具。

Sualeh Fatehi,SchemaCrawler