来自syscolumns的特定表的所有列的列表以及sys.indexes表中的isprimarykey列

时间:2012-06-28 21:00:15

标签: sql

我试图获取特定表的所有列的列表以及sys.indexes表中的数据类型和is_primary_key列。但是我无法正确获取is_primary_key列。我希望is_primary_key仅对作为表的主键的列设置为1。对于所有列,此值设置为1

以下是我正在使用的查询

select distinct c.name,c.system_type_id,is_primary_key from sys.columns c 
   inner join  sys.tables t on c.object_id=t.object_id
   inner join sys.index_columns ic on ic.column_id=c.column_id 
   inner join sys.indexes i on i.index_id=ic.index_id
   and t.name='comp' and i.is_primary_key=1

2 个答案:

答案 0 :(得分:2)

转换

inner join sys.indexes i on i.index_id=ic.index_id

inner join sys.indexes i on i.index_id=ic.index_id and i.object_id=ic.object_id

sys.indexes的主键是(object_id, index_id)。您对sys.index_columns有类似的错误。

答案 1 :(得分:1)

select '['+name+']',system_type_id, case when primarykeyCol.column_id is null then 0 else 1 end primaryCol  from sys.columns c 
left join (select c.column_id from sys.indexes i  
inner join sys.index_columns ic on i.index_id = ic.index_id and i.is_primary_key = 1 and i.object_id = object_id(@srctablename) and  ic.object_id = object_id(@srctablename)
inner join sys.columns c on ic.column_id = c.column_id and c.object_id = object_id(@srctablename) 
) primarykeyCol on primarykeyCol.column_id = c.column_id 

where c.object_id = object_id(@srctablename)