Dưới đây là một sự khởi đầu (SQL 2005 trở lên):
SELECT ta.name TableName, ind.name IndexName
from sys.tables ta
left outer join sys.indexes ind
on ind.object_id = ta.object_id
and ind.is_primary_key = 1
Bàn mà không cần khóa chính có IndexName thiết lập để Null.
Nhưng điều này chỉ liệt kê tên của khóa chính. Bạn có cần danh sách (các) cột trong khóa không?
- ADDED ----------------
Đây là một phần của tiện ích mà tôi từng viết. Điều này sẽ liệt kê tất cả các bảng, và các cột theo thứ tự của tất cả các khóa chính hiện có:
SELECT ta.name TableName, ind.name IndexName, indcol.key_ordinal IndexColumnOrder, col.name ColumnName
from sys.tables ta
left outer join sys.indexes ind
on ind.object_id = ta.object_id
and ind.is_primary_key = 1
left outer join sys.index_columns indcol
on indcol.object_id = ta.object_id
and indcol.index_id = ind.index_id
left outer join sys.columns col
on col.object_id = ta.object_id
and col.column_id = indcol.column_id
order by
ta.Name
,indcol.key_ordinal
Hacking rằng, sau đây sẽ liệt kê tất cả (và duy nhất) bảng với khóa chính chỉ có một cột:
SELECT ta.name TableName, max(col.name) ColumnName
from sys.tables ta
inner join sys.indexes ind
on ind.object_id = ta.object_id
and ind.is_primary_key = 1
inner join sys.index_columns indcol
on indcol.object_id = ta.object_id
and indcol.index_id = ind.index_id
inner join sys.columns col
on col.object_id = ta.object_id
and col.column_id = indcol.column_id
group by ta.name
having count(*) = 1
order by ta.Name
Để chuyển đổi thành C# (không phải sở trường của tôi), bạn có thể thực hiện thủ tục này hoặc chỉ cần tạo và gửi truy vấn từ bên trong mã của bạn.
Nguồn
2010-08-23 15:14:09
bản sao có thể có của [Làm cách nào để có danh sách tất cả các bảng trong cơ sở dữ liệu bằng TSQL?] (Http://stackoverflow.com/questions/175415/how-do-i-get-list-of-all-tables -in-a-database-using-tsql) –
Không trùng lặp. Tôi muốn mã C#, không phải TSQL. Có một sự khác biệt lớn. –
@Sergio: Cách để làm điều đó trong C# sẽ là thực thi một tập lệnh TSQL (ví dụ: SP). – Brian