2016-12-06 6 views
2

私は、特定の列名を持つカラムは、私のデータベースに表示される場所に関する情報を取得したい場合、私はこのクエリを実行することができますMicrosoft SQLで特定の列名を持つ主キーを持つテーブルを検索するにはどうすればよいですか?マイクロソフトSQLで

select * from information_schema.columns where column_name = 'XXXXX'; 

このクエリは、どこのインスタンスに関する豊富な情報を返します。名前を持つ列が表示されますが、参照制約については何も表示されません。

私は以下のいくつかの他のクエリを試してみたが、どれも私が欲しい情報を得ているように見えるん:

select * from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
select * from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 

私はこのような何かをするだろうクエリを書きたい:

select table_schema, table_name from INFORMATION_SCHEMA.COLUMNS 
where column_name = 'XXXXX' and IsPrimaryKey = 1; 

編集:この質問は、特定のテーブルの主キーを見つけることに関する質問と重複することが示唆されました。この質問は関連していますが、私は列の名前(多くのテーブルで発生する可能性があります)を知っていて、同じ名前の主キー列を持つテーブルがあるかどうかを知りたいからです。

+0

PRIMARY_KEYがクラスタ化されたキーの場合は、それがテーブルです。 – DVT

+2

http://stackoverflow.com/questions/3930338/sql-server-get-table-primary-key-using-sql-query – SQLChao

+0

SQL Serverのどのバージョンですか? –

答えて

1
SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + CONSTRAINT_NAME), 'IsPrimaryKey') = 1 
AND COLUMN_NAME = 'ColumnName' AND TABLE_SCHEMA = 'SchemaName' 
+0

これがなぜ落とされたのかわかりませんが、それは機能します。私は 'table_name'を' * 'に変更し、' and table_schema ... 'を削除して、それがなぜあったのか分かりません。 +1 – SqlZim

1
SELECT 
    s.name AS schema_name, 
    o.name AS table_name 
    --, * 
FROM sys.objects o 
    join sys.schemas s on s.schema_id = o.schema_id 
    join sys.indexes i on i.object_id = o.object_id 
    join sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id 
    join sys.columns c ON ic.object_id = c.object_id AND c.column_id = ic.column_id 
WHERE i.is_primary_key = 1 
    and i.name = 'XXXXX'; 

EDIT:

私はPKのは、常に単一の列でないことを示す最初の方法を書いたが、それに注意し、余分な行を削除するのを忘れました。単一の結果を返すバージョンがあります。 SqlZimで指摘したように

SELECT 
    s.name AS schema_name, 
    o.name AS table_name 
    --, * 
FROM sys.objects o 
    join sys.schemas s on s.schema_id = o.schema_id 
    join sys.indexes i on i.object_id = o.object_id 
    --join sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id 
    --join sys.columns c ON ic.object_id = c.object_id AND c.column_id = ic.column_id 
WHERE i.is_primary_key = 1 
    and i.name = 'XXXXX'; 

EDIT 2

元の質問はちょっと不明でした。列名で質問したい場合は、そのオプションを追加しました。警告:これは、PKと同じ列名を持つテーブルがある場合、複数のテーブルを返します。これは、大規模なデータベースや多数の複合キー(たとえば、FinancialYearのようなものが多くの複合キーの一部であるような金融システムなど)で最もよく起こります。

SELECT 
    s.name AS schema_name, 
    o.name AS table_name 
    --, * 
FROM sys.objects o 
    join sys.schemas s on s.schema_id = o.schema_id 
    join sys.indexes i on i.object_id = o.object_id 
    join sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id 
    join sys.columns c ON ic.object_id = c.object_id AND c.column_id = ic.column_id 
WHERE i.is_primary_key = 1 
    and c.name = 'PROGRAM_YEAR'; 
+0

列名で検索するには、最後の2つの結合が必要であることを意味する 'c.name = ...' 'i.name = ... 'でなくてはなりません。 – SqlZim

+0

タイトルの質問は、主キーの名前に基づいてテーブルを見つける方法です。一方、彼の「何かのような」クエリは列名を示します。私はオプションを追加します。 – SMM

関連する問題