我正在使用数据库后端编写应用程序,但我需要通过SQL查找所有列名和它们所属的表。我知道您可以查询sys.columns
,sys.tables
和sys.databases
,但我想要做的就是将它们全部加入以获得类似下面的结果(基本上显示来自的所有列和表) DB):
+-----------+------------+
| Tablename | columnname |
+-----------+------------+
| Table1 | Id |
| Table1 | Name |
| Table1 | Owner |
| Table2 | Id |
| Table2 | Name |
| Table2 | True |
+-----------+------------+
我已经很好地了解了sys架构,但我无法在sys.columns
或sys.tables
中找到任何父引用。
答案 0 :(得分:17)
Randy Minder的答案是最正确的答案。但是如果你想继续使用sys.columns和sys.tables在object_id上加入它们。
select tab.name, col.name
from sys.columns col
inner join sys.tables tab
on col.object_id = tab.object_id
您可以使用它来自行获取sys.columns表中的表名。
select object_name(object_id),name
from sys.columns
答案 1 :(得分:12)
您通常不希望直接查询sys.columns或sys.tables(或任何系统表)。您应该使用INFORMATION_SCHEMA视图。这些视图是查询系统表的ANSI标准方式,可以在不同版本之间进行更改。 INFORMATION_SCHEMA视图不会改变,至少是以破碎的方式。
SELECT COLUMN_NAME,*
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = <TableName> AND TABLE_SCHEMA= <SchemaName>
当然,WHERE子句在这里是可选的,可以省略以查看所有表中的所有列等。