0

我想查询数据库 sys 表以获取表、列和主键信息的列表,如下查询:

select t.name as [TableName]
, (select max(column_id) from sys.columns c where c.object_id = t.object_id) as [ColumnCount]
, (select name from sys.columns c where c.object_id = t.object_id and c.column_id = 1) as [Column01]
, (select name from sys.columns c where c.object_id = t.object_id and c.column_id = 2) as [Column02]
, (select name from sys.columns c where c.object_id = t.object_id and c.column_id = 3) as [Column03]
, (select name from sys.columns c where c.object_id = t.object_id and c.column_id = 4) as [Column04]
, (select name from sys.columns c where c.object_id = t.object_id and c.column_id = 5) as [Column05]
, (select name from sys.columns c where c.object_id = t.object_id and c.column_id = 6) as [Column06]
, (select name from sys.columns c where c.object_id = t.object_id and c.column_id = 7) as [Column07]
, (select name from sys.columns c where c.object_id = t.object_id and c.column_id = 8) as [Column08]
, (select name from sys.columns c where c.object_id = t.object_id and c.column_id = 9) as [Column09]
, (select name from sys.columns c where c.object_id = t.object_id and c.column_id = 10) as [Column10]
, (select name from sys.columns c where c.object_id = t.object_id and c.column_id = 11) as [Column11]
, (select name from sys.columns c where c.object_id = t.object_id and c.column_id = 12) as [Column12]
, (select i.is_primary_key from sys.columns c inner join sys.index_columns ic on ic.column_id = c.column_id and ic.object_id = c.object_id inner join sys.indexes i on ic.index_id = i.index_id and ic.object_id = i.object_id and i.is_primary_key <> 0 where t.object_id = c.object_id and c.column_id = 1) as [Column01PrimaryKey] 
, (select i.is_primary_key from sys.columns c inner join sys.index_columns ic on ic.column_id = c.column_id and ic.object_id = c.object_id inner join sys.indexes i on ic.index_id = i.index_id and ic.object_id = i.object_id and i.is_primary_key <> 0 where t.object_id = c.object_id and c.column_id = 2) as [Column02PrimaryKey] 
, (select i.is_primary_key from sys.columns c inner join sys.index_columns ic on ic.column_id = c.column_id and ic.object_id = c.object_id inner join sys.indexes i on ic.index_id = i.index_id and ic.object_id = i.object_id and i.is_primary_key <> 0 where t.object_id = c.object_id and c.column_id = 3) as [Column03PrimaryKey] 
, (select i.is_primary_key from sys.columns c inner join sys.index_columns ic on ic.column_id = c.column_id and ic.object_id = c.object_id inner join sys.indexes i on ic.index_id = i.index_id and ic.object_id = i.object_id and i.is_primary_key <> 0 where t.object_id = c.object_id and c.column_id = 4) as [Column04PrimaryKey] 
, (select i.is_primary_key from sys.columns c inner join sys.index_columns ic on ic.column_id = c.column_id and ic.object_id = c.object_id inner join sys.indexes i on ic.index_id = i.index_id and ic.object_id = i.object_id and i.is_primary_key <> 0 where t.object_id = c.object_id and c.column_id = 5) as [Column05PrimaryKey] 
, (select i.is_primary_key from sys.columns c inner join sys.index_columns ic on ic.column_id = c.column_id and ic.object_id = c.object_id inner join sys.indexes i on ic.index_id = i.index_id and ic.object_id = i.object_id and i.is_primary_key <> 0 where t.object_id = c.object_id and c.column_id = 6) as [Column06PrimaryKey] 
, (select i.is_primary_key from sys.columns c inner join sys.index_columns ic on ic.column_id = c.column_id and ic.object_id = c.object_id inner join sys.indexes i on ic.index_id = i.index_id and ic.object_id = i.object_id and i.is_primary_key <> 0 where t.object_id = c.object_id and c.column_id = 7) as [Column07PrimaryKey] 
, (select i.is_primary_key from sys.columns c inner join sys.index_columns ic on ic.column_id = c.column_id and ic.object_id = c.object_id inner join sys.indexes i on ic.index_id = i.index_id and ic.object_id = i.object_id and i.is_primary_key <> 0 where t.object_id = c.object_id and c.column_id = 8) as [Column08PrimaryKey] 
, (select i.is_primary_key from sys.columns c inner join sys.index_columns ic on ic.column_id = c.column_id and ic.object_id = c.object_id inner join sys.indexes i on ic.index_id = i.index_id and ic.object_id = i.object_id and i.is_primary_key <> 0 where t.object_id = c.object_id and c.column_id = 9) as [Column09PrimaryKey] 
, (select i.is_primary_key from sys.columns c inner join sys.index_columns ic on ic.column_id = c.column_id and ic.object_id = c.object_id inner join sys.indexes i on ic.index_id = i.index_id and ic.object_id = i.object_id and i.is_primary_key <> 0 where t.object_id = c.object_id and c.column_id = 10) as [Column10PrimaryKey] 
, (select i.is_primary_key from sys.columns c inner join sys.index_columns ic on ic.column_id = c.column_id and ic.object_id = c.object_id inner join sys.indexes i on ic.index_id = i.index_id and ic.object_id = i.object_id and i.is_primary_key <> 0 where t.object_id = c.object_id and c.column_id = 11) as [Column11PrimaryKey] 
, (select i.is_primary_key from sys.columns c inner join sys.index_columns ic on ic.column_id = c.column_id and ic.object_id = c.object_id inner join sys.indexes i on ic.index_id = i.index_id and ic.object_id = i.object_id and i.is_primary_key <> 0 where t.object_id = c.object_id and c.column_id = 12) as [Column12PrimaryKey] 
from sys.tables t 
;

有没有办法简化查询而不是继续手动添加更多列?

4

1 回答 1

2

尝试这样的事情 - 这会给你你想要的吗?

SELECT
    ColumnName = c.Name,
    SchemaName = s.Name, 
    TableName = t.Name,
    i.Name, i.is_primary_key
FROM
    sys.columns c 
INNER JOIN 
    sys.tables t ON c.object_id = t.object_id
INNER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
INNER JOIN 
    sys.indexes i ON i.object_id = t.object_id

它应该给你列名、模式和表名、索引名以及该索引是否是主键

于 2013-04-09T06:43:44.133 回答