답변:
이 고양이를 벗기는 몇 가지 방법이 있지만 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 년부터 사용할 수 있습니다.
Mike의 솔루션은 특정 문제에 탁월합니다.
당신이 더 많은 유연성을 원하는 경우, 여기 쉽게 쿼리로 변신 할 수있는 대안의 반환하는 등 힙 모든 테이블을 찾아, 또는 어떤 고유 제한 조건이없는 테이블을 찾는 등의 기타 정보 에 모두를 .
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 의 정책 관리 기능은이 중 일부를 수행 할 수 있습니다.
테이블 패싯에는 @HasIndex 및 @HasClusteredIndex 필드 (트리거와 같이 유용 할 수있는 다른 필드)가 있습니다. 중앙 관리 서버 기능을 사용하여 여러 서버의 모든 테이블, 모든 데이터베이스의 조건을 확인하는 정책을 만들 수 있습니다.
그러나 기본 키 인덱스 나 제약 조건이 있는지 확인할 수는 없습니다. @HasPrimaryKey 필드가 있지만 MSSQL2012에는 없다고 맹세했을 것입니다. 나는 잘못 기억하거나 화를 내고 있습니다.
참고 : 정책 관리는 SQL Server 2012 Enterprise, Business Intelligence 및 Standard 버전에 포함되어 있습니다. Express Edition에서는 사용할 수 없습니다.
sys.tables
자체가 id를 제공 하고이 멋진 기능을 보여 주셔서 감사합니다.