2

データベース内のすべての主キーを特定する必要があります。次のコードは、非常にうまく機能しているように見えます。

SELECT i.name AS IndexName,
   OBJECT_NAME (ic.OBJECT_ID) AS TableName,
   COL_NAME (ic.OBJECT_ID, ic.column_id) AS ColumnName
FROM sys.indexes AS i
   INNER JOIN sys.index_columns AS ic
      ON i.OBJECT_ID = ic.OBJECT_ID AND i.index_id = ic.index_id
WHERE i.is_primary_key = 1

私が抱えている問題は、一部のキーが複合キーであることです。このクエリは、どのキーが複合 (sys.indexes テーブル内の特定の indexName の複数の行) であるかを識別しますが、順序は表示されません。次の理由により、これを知る必要があります。

PRIMARY KEY CLUSTERED 
(
[bl_id] ASC,
[fl_id] ASC,
[rm_id] ASC
)

次と同じではありません:

PRIMARY KEY CLUSTERED 
(
[rm_id] ASC
[fl_id] ASC,
[bl_id] ASC,

)

4

1 に答える 1

3

key_ordinal はトリックを行うようです:

SELECT i.name AS IndexName,
   OBJECT_NAME (ic.OBJECT_ID) AS TableName,
   COL_NAME (ic.OBJECT_ID, ic.column_id) AS ColumnName,
   ic.Key_ordinal as ColumnOrder
FROM sys.indexes AS i
   INNER JOIN sys.index_columns AS ic
      ON i.OBJECT_ID = ic.OBJECT_ID AND i.index_id = ic.index_id
WHERE i.is_primary_key = 1
ORDER BY ic.OBJECT_ID, ic.Key_ordinal
于 2013-10-16T19:36:15.933 に答える