2017-12-24 23 views
2

SQL Server Schema Collections을 기반으로 어떤 키가 기본 키인지 확인하려면 sqlConnection.GetSchema("IndexColumns");을 사용하고 싶습니다. SQL 키 유형 코드는 어디에서 확인할 수 있습니까?

나는 몇 가지 실험을했고, 위의 요청에 나는 다음과 같은 정보를 데이터 테이블을 얻을 수 있음을 발견

table_catalog table_schema table_name    column_name ordinal_position KeyType index_name 
--------------------------------------------------------------------------------------------------------------------------- 
TestDb   dbo   TestTableWithPrimaryKey  Id    1    56  PK_TestTableWithPrimaryKey 

내가 기본 키에 대한 KeyType = 56 스탠드를 추측하지만,이는이 테이블에서 추론된다 정의 :

CREATE TABLE [dbo].[TestTableWithPrimaryKey] 
(
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Foo] [nvarchar](50) NOT NULL, 

    CONSTRAINT [PK_TestTableWithPrimaryKey] 
     PRIMARY KEY CLUSTERED ([Id] ASC) 
) ON [PRIMARY] 

실제로 모든 프로젝트에서 사용하기 전에 내 발견이 올바른지 확인하고 싶습니다. 모든 키 유형을 얻을 수있는 곳이 있습니까?

답변

1

sqlConnection.GetSchema("IndexColumns");에 대한 호출이 실행 명령 조회는이 항목이 있다는 것을 의미 IndexColumns

<MetaDataCollections> 
    <CollectionName>IndexColumns</CollectionName> 
    <NumberOfRestrictions>5</NumberOfRestrictions> 
    <NumberOfIdentifierParts>4</NumberOfIdentifierParts> 
    <PopulationMechanism>SQLCommand</PopulationMechanism> 
    <PopulationString>EXEC sys.sp_indexcolumns_managed @Catalog, @Owner, @Table, @ConstraintName, @Column</PopulationString> 
    <MinimumVersion>10.00.0000</MinimumVersion> 
    </MetaDataCollections> 

을 우리에게 보여줍니다 않습니다 EXEC sys.sp_indexcolumns_managed을 실행합니다.

select distinct 
    db_Name() as constraint_catalog, 
    constraint_schema = SCHEMA_NAME(o.schema_id), 
    constraint_name = x.name, 
    table_catalog = db_name(), 
    table_schema = SCHEMA_NAME(o.schema_id), 
    table_name = o.name, 
    column_name = c.name, 
    ordinal_position = xc.key_ordinal, 
    KeyType = c.system_type_id, 
    index_name = x.name 
from 
    sys.objects o INNER JOIN sys.indexes x ON 
     (
      o.object_id = x.object_id AND 
      o.type in ('U') 
     ) INNER JOIN 
    sys.index_columns xc ON 
     (
      xc.object_id = x.object_id AND 
      xc.index_id = x.index_id 
     ) INNER JOIN 
    sys.columns c ON 
     (
      o.object_id = c.object_id AND 
      xc.column_id = c.column_id 
     ) 

(가 Resource Database의 일부이기 때문에 당신은 SELECT OBJECT_DEFINITION(OBJECT_ID('sys.sp_indexcolumns_managed'));와 정의를 찾을 수 있습니다)

이제 우리는 볼 수 있습니다 : 그것은 sys.spt_indexcolumns_view_managed에서 선택하고 해당 뷰는 다음과 같이 정의되어 그 저장 프로 시저가 EXEC sp_helptext 'sys.sp_indexcolumns_managed'와 함께 발표 할 예정이다 칼럼에 KeyType는 열 시스템 유형 sys.columns

ID로서 설명되어 sys.columns.system_type_id 위에 투영된다.

Where do I find Sql Server metadata for column datatypes? 세부 사항은 sys.types에 가입하는 것은 당신에게 열의 종류의 정보를 제공 할 것입니다.해당 정보로

무장 우리가 이미 나는에 KeyType = 56 추측 기본 키을 의미한다는 결론을 내릴 수는 진실하고

select name, system_type_id, user_type_id, schema_id, max_length, precision scale 
from sys.types 
where system_type_id = 56 

name system_type_id user_type_id schema_id max_length scale 
---- -------------- ------------ --------- ---------- ----- 
int 56    56   4   4   10  

를 반환합니다 실행하지 않으며 그것은이다 columntype이 아니라 기본 키인 경우.

GetSchema 호출 AFAICT를 사용하여 기본 키를 찾는 신뢰할 수있는 방법이없는 것처럼 보입니다. Dan Guzman에서 제공하는 쿼리를 사용하십시오.

+0

이것은 정말 놀라운 형사 작업입니다. 나는 SQL을 그렇게 잘 알지 못하므로 지금까지 절반도 못 갔을 것입니다 - 그리고 나는 당신의 답을 통해 많은 것을 배웠습니다. 그들이 다른 곳에서 _DataType_이라고 정확하게 불리우는 그러한 혼란스러운 이름 _KeyType_을 선택하는 것은 유감입니다. 이 답변은 내가 확인하길 원하는 마법의 숫자 인 '56'의 가장 아래쪽에 있기 때문에 받아 들일 것입니다. 그리고 이것은 미래에 내 자신이 어떻게 할 수있는 몇 가지 새로운 도구를 보여줍니다. _Plan B_ 솔루션으로는 내 이론이 틀린 것으로 판명 된대로 @ 단 길즈 만이 제안한 것으로 전환하십시오. – t3chb0t

3

KeyType 열이 SQL 서버 sys.types 카탈로그 뷰 system_type 열에 열거으로 열 데이터 형식으로 매핑하는 표시 (56 int 값이다). 결과적으로 기본 키의 구성원으로 열을 식별하는 데 도움이되지 않습니다.

SMO 및 카탈로그 뷰 쿼리를 포함하여 SQL Server 기본 키 열을 가져 오는 데는 여러 가지 방법이 있습니다. 다음은 SQL Server 용 데이터베이스의 모든 기본 키 열을 가져 오는 한 가지 예입니다. 여러 DBMS 제품을 지원해야하는 경우 해당 ANSI 표준보기를 구현하는 DBMS 제품에 대한 INFORMATION_SCHEMA 카탈로그 뷰를 대신 사용할 수 있습니다. 리소스 파일 System.Data.SqlClient.SqlMetaData.xml에서 발견으로 내부 SqlMetaDataFactory보고

SELECT 
     OBJECT_SCHEMA_NAME(i.object_id) AS SchemaName 
    , OBJECT_NAME(i.object_id) AS TableName 
    , c.name AS ColumnName 
    , ic.key_ordinal AS KeyOrdinal 
FROM sys.key_constraints AS kc 
JOIN sys.indexes AS i ON i.object_id = kc.parent_object_id AND kc.name = i.name 
JOIN sys.index_columns AS ic ON ic.object_id = i.object_id AND ic.index_id = i.index_id 
JOIN sys.columns AS c ON c.object_id = ic.object_id AND c.column_id = ic.column_id 
WHERE kc.type_desc = N'PRIMARY_KEY_CONSTRAINT' 
ORDER BY 
     SchemaName 
    , TableName 
    , KeyOrdinal;