SQLServerで列の一覧はすぐとれるんだけど、主キーかどうかわからない。なので主キーかどうかのフラグを一緒につけたい場合は↓の感じ。

select 
X.name as tablename
,Y.object_id
,Y.name
,Y.column_id
,Y.system_type_id
,Y.max_length
,Y.is_nullable
,Y.is_identity
,isnull(Z.is_primary_key,0) as is_primary_key
from (
	select * from sys.tables where type = 'U'
) as X
inner join (
	select * from sys.columns
) as Y
on X.object_id = Y.object_id
left join (
	select X.object_id,Y.column_id,Z.is_primary_key from sys.columns as X
	inner join sys.index_columns as Y
	on X.object_id = Y.object_id
	and X.column_id = Y.column_id
	inner join sys.indexes as Z
	on Y.object_id = Z.object_id
	and Y.index_id = Z.index_id
	where Z.is_primary_key = 1
) as Z
on Y.object_id = Z.object_id
and Y.column_id = Z.column_id

もっといい感じに書けると思うけど、ちょっとやっつけ。