次のクエリを使用してSQL Server 2012で制約の情報を取得し、完全に機能しました。それがあなたに役立つことを願っています。
SELECT
tab.name AS [Table]
,tab.id AS [Table Id]
,constr.name AS [Constraint Name]
,constr.xtype AS [Constraint Type]
,CASE constr.xtype WHEN 'PK' THEN 'Primary Key' WHEN 'UQ' THEN 'Unique' ELSE '' END AS [Constraint Name]
,i.index_id AS [Index ID]
,ic.column_id AS [Column ID]
,clmns.name AS [Column Name]
,clmns.max_length AS [Column Max Length]
,clmns.precision AS [Column Precision]
,CASE WHEN clmns.is_nullable = 0 THEN 'NO' ELSE 'YES' END AS [Column Nullable]
,CASE WHEN clmns.is_identity = 0 THEN 'NO' ELSE 'YES' END AS [Column IS IDENTITY]
FROM SysObjects AS tab
INNER JOIN SysObjects AS constr ON(constr.parent_obj = tab.id AND constr.type = 'K')
INNER JOIN sys.indexes AS i ON((i.index_id > 0 and i.is_hypothetical = 0) AND (i.object_id=tab.id) AND i.name = constr.name)
INNER JOIN sys.index_columns AS ic ON (ic.column_id > 0 and (ic.key_ordinal > 0 or ic.partition_ordinal = 0 or ic.is_included_column != 0))
AND (ic.index_id=CAST(i.index_id AS int)
AND ic.object_id=i.object_id)
INNER JOIN sys.columns AS clmns ON clmns.object_id = ic.object_id and clmns.column_id = ic.column_id
WHERE tab.xtype = 'U'
ORDER BY tab.name
助けてくれてありがとうございましたが、私はsysObjects自体を使用してクエリを実行したいと考えていました。必要な結果を得るためにクエリを微調整する方法はありますか? – unos
クエリには、最初のテーブルの最初の制約のみが表示されます。 –
@SteveStaple:いいえ、そうではありません.....私はこれを常に使用しています - **すべての**テーブルの**すべての**制約をリストしています! 'AdventureWorks'で試してみましょう。私は152行あり、複数のテーブルには複数の制約があります。 'Employee'テーブルには6つ以上の制約があり、すべてがうまく表示されます。 –