SQL Server 2008 - 테이블 제약 조건 가져오기
모든 테이블의 제약 조건, 각 테이블의 제약 조건 수 및 표시를 검색하는 쿼리를 구성하는 것을 도와줄 수 있습니까?NULL
제약 조건이 없는 테이블의 경우.
지금까지 제가 가진 것은 다음과 같습니다.
Select SysObjects.[Name] As [Constraint Name] ,
Tab.[Name] as [Table Name],
Col.[Name] As [Column Name]
From SysObjects Inner Join
(Select [Name],[ID] From SysObjects) As Tab
On Tab.[ID] = Sysobjects.[Parent_Obj]
Inner Join sysconstraints On sysconstraints.Constid = Sysobjects.[ID]
Inner Join SysColumns Col On Col.[ColID] = sysconstraints.[ColID] And Col.[ID] = Tab.[ID]
order by [Tab].[Name]
전류를 사용해야 합니다.sys
카탈로그 보기(SQL Server 2005 이상 버전인 경우)sysobjects
보기는 더 이상 사용되지 않으므로 피해야 합니다.) - 여기에서 카탈로그 보기에 대한 광범위한 MSDN SQL Server Books 온라인 설명서를 확인하십시오.
관심을 가질 수 있는 뷰는 다음과 같습니다.
sys.default_constraints
열에 대한 기본 구속조건의 경우sys.check_constraints
열에 대한 제약 조건 검사sys.key_constraints
키 제약 조건(예: 기본 키)sys.foreign_keys
외교상의 중요한 관계를 위하여.
그리고 더 많은 것들 - 그것을 확인하세요!
이러한 뷰를 쿼리하고 조인하여 필요한 정보를 얻을 수 있습니다. 예를 들어 테이블, 열 및 테이블에 정의된 모든 기본 제약 조건이 나열됩니다.
SELECT
TableName = t.Name,
ColumnName = c.Name,
dc.Name,
dc.definition
FROM sys.tables t
INNER JOIN sys.default_constraints dc ON t.object_id = dc.parent_object_id
INNER JOIN sys.columns c ON dc.parent_object_id = c.object_id AND c.column_id = dc.parent_column_id
ORDER BY t.Name
이 쿼리를 사용할 수 있습니다.
고유 구속조건,
값이 있는 기본 구속조건,
참조 테이블 및 열이 있는 외부 키
기본 키 제약 조건도 있습니다.
Select C.*, (Select definition From sys.default_constraints Where object_id = C.object_id) As dk_definition,
(Select definition From sys.check_constraints Where object_id = C.object_id) As ck_definition,
(Select name From sys.objects Where object_id = D.referenced_object_id) As fk_table,
(Select name From sys.columns Where column_id = D.parent_column_id And object_id = D.parent_object_id) As fk_col
From sys.objects As C
Left Join (Select * From sys.foreign_key_columns) As D On D.constraint_object_id = C.object_id
Where C.parent_object_id = (Select object_id From sys.objects Where type = 'U'
And name = 'Table Name Here');
다음 쿼리를 사용하여 SQL Server 2012의 제약 조건 정보를 검색했으며 완벽하게 작동합니다.그것이 당신에게 유용하기를 바랍니다.
SELECT
tab.name AS [Table]
,tab.id AS [Table Id]
,constr.name AS [Constraint Name]
,constr.xtype AS [Constraint Type]
,CASE constr.xtype WHEN 'PK' THEN 'Primary Key' WHEN 'UQ' THEN 'Unique' ELSE '' END AS [Constraint Name]
,i.index_id AS [Index ID]
,ic.column_id AS [Column ID]
,clmns.name AS [Column Name]
,clmns.max_length AS [Column Max Length]
,clmns.precision AS [Column Precision]
,CASE WHEN clmns.is_nullable = 0 THEN 'NO' ELSE 'YES' END AS [Column Nullable]
,CASE WHEN clmns.is_identity = 0 THEN 'NO' ELSE 'YES' END AS [Column IS IDENTITY]
FROM SysObjects AS tab
INNER JOIN SysObjects AS constr ON(constr.parent_obj = tab.id AND constr.type = 'K')
INNER JOIN sys.indexes AS i ON( (i.index_id > 0 and i.is_hypothetical = 0) AND (i.object_id=tab.id) AND i.name = constr.name )
INNER JOIN sys.index_columns AS ic ON (ic.column_id > 0 and (ic.key_ordinal > 0 or ic.partition_ordinal = 0 or ic.is_included_column != 0))
AND (ic.index_id=CAST(i.index_id AS int)
AND ic.object_id=i.object_id)
INNER JOIN sys.columns AS clmns ON clmns.object_id = ic.object_id and clmns.column_id = ic.column_id
WHERE tab.xtype = 'U'
ORDER BY tab.name
SELECT
[oj].[name] [TableName],
[ac].[name] [ColumnName],
[dc].[name] [DefaultConstraintName],
[dc].[definition]
FROM
sys.default_constraints [dc],
sys.all_objects [oj],
sys.all_columns [ac]
WHERE
(
([oj].[type] IN ('u')) AND
([oj].[object_id] = [dc].[parent_object_id]) AND
([oj].[object_id] = [ac].[object_id]) AND
([dc].[parent_column_id] = [ac].[column_id])
)
marc_s에서 제공한 답변을 수정하려고 했지만 어떤 이유로 승인되지 않았습니다.읽기 쉽도록 SQL을 포맷하고 스키마를 포함하며 기본 이름을 지정하여 다른 코드에 쉽게 붙여넣을 수 있습니다.
SELECT SchemaName = s.Name,
TableName = t.Name,
ColumnName = c.Name,
DefaultName = dc.Name,
DefaultDefinition = dc.Definition
FROM sys.schemas s
JOIN sys.tables t on t.schema_id = s.schema_id
JOIN sys.default_constraints dc on dc.parent_object_id = t.object_id
JOIN sys.columns c on c.object_id = dc.parent_object_id
and c.column_id = dc.parent_column_id
ORDER BY s.Name, t.Name, c.name
외부 키를 가져오는 스크립트는 다음과 같습니다.
SELECT TOP(150)
t.[name] AS [Table],
cols.[name] AS [Column],
t2.[name] AS [Referenced Table],
c2.[name] AS [Referenced Column],
constr.[name] AS [Constraint]
FROM sys.tables t
INNER JOIN sys.foreign_keys constr ON constr.parent_object_id = t.object_id
INNER JOIN sys.tables t2 ON t2.object_id = constr.referenced_object_id
INNER JOIN sys.foreign_key_columns fkc ON fkc.constraint_object_id = constr.object_id
INNER JOIN sys.columns cols ON cols.object_id = fkc.parent_object_id AND cols.column_id = fkc.parent_column_id
INNER JOIN sys.columns c2 ON c2.object_id = fkc.referenced_object_id AND c2.column_id = fkc.referenced_column_id
--WHERE t.[name] IN ('?', '?', ...)
ORDER BY t.[Name], cols.[name]
언급URL : https://stackoverflow.com/questions/14229277/sql-server-2008-get-table-constraints
'programing' 카테고리의 다른 글
행 번호를 사용하여 표의 두 번째 행 선택 (0) | 2023.06.20 |
---|---|
Node.js로 이메일을 보내시겠습니까? (0) | 2023.06.20 |
HttpClient에서 기본 사용자 에이전트를 설정하려면 어떻게 해야 합니까? (0) | 2023.06.20 |
특정 디렉토리에서 어떻게 'git diff'를 합니까? (0) | 2023.06.20 |
단일 파일에서 충돌 해결 다시 시작/실행 취소 (0) | 2023.06.20 |