回答:
このクエリはあなたが欲しいものを与える必要があります:
select distinct t.name
from sys.partitions p
inner join sys.tables t
on p.object_id = t.object_id
where p.partition_number <> 1
sys.partitions
カタログビューは、テーブルとインデックスのほとんどすべてのパーティションのリストが表示されます。sys.tables
テーブルを取得するためにそれを結合するだけです。
すべてのテーブルには少なくとも1つのパーティションがあるため、パーティションテーブルを特に探している場合は、このクエリをsys.partitions.partition_number <> 1
(に基づいてフィルタリングする必要があります(非パーティションテーブルの場合、partition_number
常に1に等しくなります)。
partition_id
WHERE句の代わりに必要partition_number
です。謝罪いたします。
より良いクエリは次のように考えられます:
select object_schema_name(i.object_id) as [schema],
object_name(i.object_id) as [object],
i.name as [index],
s.name as [partition_scheme]
from sys.indexes i
join sys.partition_schemes s on i.data_space_id = s.data_space_id
これは、パーティションスキームを識別するために「適切な」場所を確認します:sys.partition_schemes
、適切なカーディナリティを持ち(の必要なしdistinct
)、パーティション化されたオブジェクトのみを表示し(フィルターwhere
句は不要)、スキーマ名とパーティションスキーム名を投影します。また、このクエリが元の質問の欠陥をどのように強調するかに注意してください。パーティション化されたテーブルではなく、インデックス(これにはインデックス0と1、別名ヒープとクラスタ化インデックスが含まれます)。テーブルには複数のインデックスを含めることができ、一部はパーティション化され、一部はそうではありません。
それでは、2を組み合わせてみてください。
select
object_schema_name(i.object_id) as [schema],
object_name(i.object_id) as [object_name],
t.name as [table_name],
i.name as [index_name],
s.name as [partition_scheme]
from sys.indexes i
join sys.partition_schemes s on i.data_space_id = s.data_space_id
join sys.tables t on i.object_id = t.object_id