我遇到了一个棘手的问题。我有一个使用Microsoft SQL 2008的数据库,在这个数据库中有很多表。这些表是自动生成的,没有有意义的名称。我需要一个特定的表,我似乎无法找到它。
我知道调用表中一些列的名称是什么。有没有办法我可以一次查看所有表格,查看列的名称,看看它们是否与我所知道的相匹配。
如果他们这样做,那么我可以在桌子上看得更远,看看它是否是我正在寻找的那个。这听起来像是解决问题的好方法吗?可能吗?任何从哪里开始的想法?
答案 0 :(得分:2)
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 ... */
答案 1 :(得分:1)
使用Information_schema.columns而不是sys.columns替代Aaron的答案
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
答案 2 :(得分:0)
使用上面的脚本,您只能使用SQL wild-carding,这可能非常有限。您可以使用SchemaCrawler grep更强大地使用正则表达式搜索数据库。 SchemaCrawler还允许您使用其他功能来查找与外键相关的表,因此,例如,您可以说找到所有具有客户地址列的表以及引用这些表的表。 SchemaCrawler是一个与Microsoft SQL Server数据库驱动程序捆绑在一起的命令行工具。
Sualeh Fatehi,SchemaCrawler