복붙노트

[SQL] SQL 서버 : 사용하여 테이블의 기본 키를 얻기 SQL 쿼리 [중복]

SQL

SQL 서버 : 사용하여 테이블의 기본 키를 얻기 SQL 쿼리 [중복]

나는 SQL Server 데이터베이스에 대한 SQL 쿼리를 사용하여 특정 테이블의 기본 키를 싶어.

MySQL의에서 나는 테이블의 기본 키를 얻기 위해 다음 쿼리를 사용하고 있습니다 :

SHOW KEYS FROM tablename WHERE Key_name = 'PRIMARY'

어떻게 SQL Server에 대한 위의 쿼리와 동일?.

MySQL과 SQL 서버 모두에 대해 작동하는 쿼리가있는 경우 다음 그것은 이상적인 경우 일 것이다.

해결법

  1. ==============================

    1.또한 SQL Server에 대한 또 다른 하나를 발견 :

    또한 SQL Server에 대한 또 다른 하나를 발견 :

    SELECT COLUMN_NAME
    FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + QUOTENAME(CONSTRAINT_NAME)), 'IsPrimaryKey') = 1
    AND TABLE_NAME = 'TableName' AND TABLE_SCHEMA = 'Schema'
    
  2. ==============================

    2.또 다른 하나를 찾을 수 :

    또 다른 하나를 찾을 수 :

    SELECT KU.table_name as TABLENAME,column_name as PRIMARYKEYCOLUMN
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC
    INNER JOIN
        INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KU
              ON TC.CONSTRAINT_TYPE = 'PRIMARY KEY' AND
                 TC.CONSTRAINT_NAME = KU.CONSTRAINT_NAME AND 
                 KU.table_name='yourTableName'
    ORDER BY KU.TABLE_NAME, KU.ORDINAL_POSITION;
    

    나는 SQL 서버 2,005 분의 2,003에 검사를하지

  3. ==============================

    3.SQL 서버 2005을 사용하면, 당신은 시도 할 수 있습니다

    SQL 서버 2005을 사용하면, 당신은 시도 할 수 있습니다

    SELECT  i.name AS IndexName,
            OBJECT_NAME(ic.OBJECT_ID) AS TableName,
            COL_NAME(ic.OBJECT_ID,ic.column_id) AS ColumnName
    FROM    sys.indexes AS i INNER JOIN 
            sys.index_columns AS ic ON  i.OBJECT_ID = ic.OBJECT_ID
                                    AND i.index_id = ic.index_id
    WHERE   i.is_primary_key = 1
    

    - 2005 - SQL 서버에서 찾을 데이터베이스에서 기본 키 제약 조건으로 찾기 테이블

  4. ==============================

    4.메모리에서,이 중이이다

    메모리에서,이 중이이다

    SELECT * FROM sys.objects
    WHERE type = 'PK' 
    AND  object_id = OBJECT_ID ('tableName')
    

    아니면 이거..

    SELECT * FROM sys.objects
    WHERE type = 'PK' 
    AND  parent_object_id = OBJECT_ID ('tableName')
    

    나는 그들 중 하나는 아마도 데이터가 저장되는 방식에 따라 작동합니다 생각 하지만 난 실제로 같은를 확인하려면 SQL에 액세스 할 수 없습니다 두렵다.

  5. ==============================

    5.

    SELECT COLUMN_NAME FROM {DATABASENAME}.INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE TABLE_NAME LIKE '{TABLENAME}' AND CONSTRAINT_NAME LIKE 'PK%'
    
  6. ==============================

    6.

    select * 
    from sysobjects 
    where xtype='pk' and 
       parent_obj in (select id from sysobjects where name='tablename')
    

    이 SQL 2005에서 작동합니다

  7. ==============================

    7.이것은 모든 제약 조건을 나열해야하고 마지막에 당신은 당신의 필터를 넣을 수 있습니다

    이것은 모든 제약 조건을 나열해야하고 마지막에 당신은 당신의 필터를 넣을 수 있습니다

    /* CAST IS DONE , SO THAT OUTPUT INTEXT FILE REMAINS WITH SCREEN LIMIT*/
    WITH   ALL_KEYS_IN_TABLE (CONSTRAINT_NAME,CONSTRAINT_TYPE,PARENT_TABLE_NAME,PARENT_COL_NAME,PARENT_COL_NAME_DATA_TYPE,REFERENCE_TABLE_NAME,REFERENCE_COL_NAME) 
    AS
    (
    SELECT  CONSTRAINT_NAME= CAST (PKnUKEY.name AS VARCHAR(30)) ,
            CONSTRAINT_TYPE=CAST (PKnUKEY.type_desc AS VARCHAR(30)) ,
            PARENT_TABLE_NAME=CAST (PKnUTable.name AS VARCHAR(30)) ,
            PARENT_COL_NAME=CAST ( PKnUKEYCol.name AS VARCHAR(30)) ,
            PARENT_COL_NAME_DATA_TYPE=  oParentColDtl.DATA_TYPE,        
            REFERENCE_TABLE_NAME='' ,
            REFERENCE_COL_NAME='' 
    
    FROM sys.key_constraints as PKnUKEY
        INNER JOIN sys.tables as PKnUTable
                ON PKnUTable.object_id = PKnUKEY.parent_object_id
        INNER JOIN sys.index_columns as PKnUColIdx
                ON PKnUColIdx.object_id = PKnUTable.object_id
                AND PKnUColIdx.index_id = PKnUKEY.unique_index_id
        INNER JOIN sys.columns as PKnUKEYCol
                ON PKnUKEYCol.object_id = PKnUTable.object_id
                AND PKnUKEYCol.column_id = PKnUColIdx.column_id
         INNER JOIN INFORMATION_SCHEMA.COLUMNS oParentColDtl
                ON oParentColDtl.TABLE_NAME=PKnUTable.name
                AND oParentColDtl.COLUMN_NAME=PKnUKEYCol.name
    UNION ALL
    SELECT  CONSTRAINT_NAME= CAST (oConstraint.name AS VARCHAR(30)) ,
            CONSTRAINT_TYPE='FK',
            PARENT_TABLE_NAME=CAST (oParent.name AS VARCHAR(30)) ,
            PARENT_COL_NAME=CAST ( oParentCol.name AS VARCHAR(30)) ,
            PARENT_COL_NAME_DATA_TYPE= oParentColDtl.DATA_TYPE,     
            REFERENCE_TABLE_NAME=CAST ( oReference.name AS VARCHAR(30)) ,
            REFERENCE_COL_NAME=CAST (oReferenceCol.name AS VARCHAR(30)) 
    FROM sys.foreign_key_columns FKC
        INNER JOIN sys.sysobjects oConstraint
                ON FKC.constraint_object_id=oConstraint.id 
        INNER JOIN sys.sysobjects oParent
                ON FKC.parent_object_id=oParent.id
        INNER JOIN sys.all_columns oParentCol
                ON FKC.parent_object_id=oParentCol.object_id /* ID of the object to which this column belongs.*/
                AND FKC.parent_column_id=oParentCol.column_id/* ID of the column. Is unique within the object.Column IDs might not be sequential.*/
        INNER JOIN sys.sysobjects oReference
                ON FKC.referenced_object_id=oReference.id
        INNER JOIN INFORMATION_SCHEMA.COLUMNS oParentColDtl
                ON oParentColDtl.TABLE_NAME=oParent.name
                AND oParentColDtl.COLUMN_NAME=oParentCol.name
        INNER JOIN sys.all_columns oReferenceCol
                ON FKC.referenced_object_id=oReferenceCol.object_id /* ID of the object to which this column belongs.*/
                AND FKC.referenced_column_id=oReferenceCol.column_id/* ID of the column. Is unique within the object.Column IDs might not be sequential.*/
    
    )
    
    select * from   ALL_KEYS_IN_TABLE
    where   
        PARENT_TABLE_NAME  in ('YOUR_TABLE_NAME') 
        or REFERENCE_TABLE_NAME  in ('YOUR_TABLE_NAME')
    ORDER BY PARENT_TABLE_NAME,CONSTRAINT_NAME;
    

    http://blogs.msdn.com/b/sqltips/archive/2005/09/16/469136.aspx - 참고 통해 읽어 주시기 바랍니다

  8. ==============================

    8.당신이 정확한 차 필드를 얻으려면 당신이 상태로 TABLE_NAME 및 TABLE_SCHEMA을 둘 필요가 있음을 유의하십시오.

    당신이 정확한 차 필드를 얻으려면 당신이 상태로 TABLE_NAME 및 TABLE_SCHEMA을 둘 필요가 있음을 유의하십시오.

    이 솔루션은 작동합니다 :

    select COLUMN_NAME from information_schema.KEY_COLUMN_USAGE 
    where CONSTRAINT_NAME='PRIMARY' AND TABLE_NAME='TABLENAME' 
    AND TABLE_SCHEMA='DATABASENAME'
    
  9. ==============================

    9.나는 당신을주지 코드뿐만 아니라 키,하지만 SQL Server에서 테이블의 데이터를 많이 작동하고 검색합니다. SQL 서버 2K5 / 2K8에서 테스트되어, 2K에 대해 몰라. 즐겨!

    나는 당신을주지 코드뿐만 아니라 키,하지만 SQL Server에서 테이블의 데이터를 많이 작동하고 검색합니다. SQL 서버 2K5 / 2K8에서 테스트되어, 2K에 대해 몰라. 즐겨!

    SELECT DISTINCT
        sys.tables.object_id AS TableId,
        sys.columns.column_id AS ColumnId,
        sys.columns.name AS ColumnName,
        sys.types.name AS TypeName,
        sys.columns.precision AS NumericPrecision,
        sys.columns.scale AS NumericScale,
        sys.columns.is_nullable AS IsNullable,
        (   SELECT 
                COUNT(column_name)
            FROM 
                INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 
            WHERE
                TABLE_NAME = sys.tables.name AND
                CONSTRAINT_NAME =
                    (   SELECT
                        constraint_name
                        FROM 
                            INFORMATION_SCHEMA.TABLE_CONSTRAINTS
                        WHERE
                            TABLE_NAME = sys.tables.name AND                    
                            constraint_type = 'PRIMARY KEY' AND
                            COLUMN_NAME = sys.columns.name
                    )
        ) AS IsPrimaryKey,
        sys.columns.max_length / 2 AS CharMaxLength /*BUG*/
    FROM 
        sys.columns, sys.types, sys.tables 
    WHERE
        sys.tables.object_id = sys.columns.object_id AND
        sys.types.system_type_id = sys.columns.system_type_id AND
        sys.types.user_type_id = sys.columns.user_type_id AND
        sys.tables.name = 'TABLE'
    ORDER BY 
        IsPrimaryKey
    

    당신은 기본 키 부분을 사용할 수 있습니다,하지만 난 나머지는 편리한 될 수도 있다고 생각합니다. 친애하는, 데이비드

  10. ==============================

    10.그것은 BOL에 따라 ... 또한 (Transact-SQL)를 참조하십시오입니다.

    그것은 BOL에 따라 ... 또한 (Transact-SQL)를 참조하십시오입니다.

    -- exec sp_serveroption 'SERVER NAME', 'data access', 'true' --execute once  
    
    EXEC sp_primarykeys @table_server = N'server_name', 
      @table_name = N'table_name',
      @table_catalog = N'db_name', 
      @table_schema = N'schema_name'; --frequently 'dbo'
    
  11. from https://stackoverflow.com/questions/3930338/sql-server-get-table-primary-key-using-sql-query by cc-by-sa and MIT license