2016-12-06 50 views
2

在Microsoft SQL,如果我想獲得其中具有一定的列名的列會出現在我的數據庫中的信息,我可以運行此查詢:如何在Microsoft 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

不知道爲什麼這是downvoted,但它的作品。我會將'table_name'更改爲'*'並刪除'和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'; 

編輯:

我寫證明的PK並不總是單列的第一種方式,但忘了注意,並刪除多餘的行。這是返回單個結果的版本。

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

原來的問題有點不清楚由SqlZim指出。如果你想問列名稱,我已經添加了該選項。警告:如果您有與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

要按列名搜索,它應該是'c.name = ...'而不是'i.name = ...'這意味着您確實需要最後兩個連接。 – SqlZim

+0

標題中的問題是如何根據主鍵名找到表。另一方面,他的「類似」查詢表示列名。我會添加一個選項。 – SMM

相關問題