Answers:
有几种方法可以给这只猫换皮,但是这种方法在SQL Server 2005及更高版本中都可以正常工作,我发现这是解决问题的一种轻松方法-
该OBJECTPROPERTY()
函数可以列出有关对象的各种属性-例如表。这些属性之一是表是否具有主键。
OBJECTPROPERTY(object_id, tablehasprimarykey)
= 0将是一个没有主键的表。
所以
SELECT OBJECT_SCHEMA_NAME( object_id ) as SchemaName, name AS TableName
FROM sys.tables
WHERE OBJECTPROPERTY(object_id,'tablehasprimaryKey') = 0
ORDER BY SchemaName, TableName ;
应该给你你所需要的。您可以在联机丛书中查看有关使用OBJECTPROPERTY()函数的所有其他方式的所有信息。这是本文的2012年版本。
objectproperty()
从2005年起就可以使用了,我刚刚检查了bol,对吗?
迈克的解决方案非常适合特定问题。
如果你想要更多的灵活性,这里是一个可以很容易演变成一个查询的替代方案,返回其他信息,如发现有堆所有表,或发现没有唯一约束的表在所有。
SELECT
OBJECT_SCHEMA_NAME(t.object_id) AS SchemaName,
t.name AS TableName
FROM sys.tables t
WHERE
NOT EXISTS
(
SELECT *
FROM sys.indexes i
WHERE
(i.object_id = t.object_id) AND
(i.is_primary_key = 1)
);
一旦您的(子系统)表超过50个表,熟悉所有元数据表就非常重要,因为正如您所说,手动浏览每个表是不切实际的(而且容易出错!)。
SQL Server 的策略管理功能可以做到这一点。
Table方面包含@HasIndex和@HasClusteredIndex字段(以及其他可能有用的字段,例如触发器)。可以创建一个策略来检查许多服务器(使用中央管理服务器功能)中所有表,所有数据库中的条件。
但是,它无法检查主键索引或约束的存在。我会发誓那里没有@HasPrimaryKey字段,但MSSQL2012中没有。我要么记错了要么发疯了。
注意:策略管理包含在SQL Server 2012 Enterprise,Business Intelligence和Standard版本中。Express版本不提供此功能。
sys.tables
它本身给出了id,并感谢您展示了这个出色的功能。