Sql-Server

列出索引和約束

  • January 31, 2019

我正在查看我繼承的應用程序的 SQL Server 數據庫。我已經有大約 10 年沒有研究 SQL Server 了,所以請多多包涵。

我正在查看的數據庫表有一個bigint NOT NULL名為 的列id,但是,當我檢查約束時,我看不到任何約束,所有數據庫表也是如此。

我是否正確假設這些表上沒有主鍵和索引(集群或非集群)?

我執行了以下查詢,結果似乎證實了我的懷疑:

//**returns 0**
select count(*) from INFORMATION_SCHEMA.TABLE_CONSTRAINTS;

//**returns no rows**
select * from sys.indexes
where object_id = (select object_id from sys.objects where name = 'NAME-OF-TABLE');

//**returns all tables in database**
SELECT name
FROM sys.tables 
WHERE OBJECTPROPERTY(object_id,'IsIndexed') = 0;

這兩個查詢可能會對您有所幫助。第一個將列出數據庫中這些表的所有表和索引。如果該表沒有出現在列表中,則沒有在其上定義任何索引。這些查詢假定 SQL Server 版本 2005 或更高版本。

SELECT 
   IndexName = QUOTENAME(I.name), 
   TableName =
       QUOTENAME(SCHEMA_NAME(T.[schema_id])) + 
       N'.' + QUOTENAME(T.name), 
   IsPrimaryKey = I.is_primary_key
FROM sys.indexes AS I
INNER JOIN sys.tables AS T
   ON I.[object_id] = T.[object_id]
WHERE
   I.type_desc <> N'HEAP'
ORDER BY 
   TableName ASC, 
   IndexName ASC;

第二個查詢將為每個表報告身份列,如果在數據庫中的每個表上有的話。

SELECT
   TableName =
       QUOTENAME(SCHEMA_NAME(T.[schema_id])) + 
       N'.' + QUOTENAME(T.name), 
   IdentityColumn = COALESCE(QUOTENAME(C.name), N'No identity column')
FROM sys.tables AS T
LEFT OUTER JOIN sys.columns AS C
   ON T.[object_id] = C.[object_id]
   AND C.is_identity = 1
ORDER BY
   TableName ASC;

要將查詢限制為特定表,請添加WHERE類似於以下內容的子句:

WHERE T.name = N'NAME-OF-TABLE'

引用自:https://dba.stackexchange.com/questions/63185