2008-09-18 13 views
74

सरल सवाल, आप टी-एसक्यूएल के साथ तालिका की प्राथमिक कुंजी कैसे सूचीबद्ध करते हैं? मुझे पता है कि टेबल पर इंडेक्स कैसे प्राप्त करें, लेकिन यह याद नहीं कर सकता कि पीके कैसे प्राप्त करें।आप SQL सर्वर तालिका की प्राथमिक कुंजी कैसे सूचीबद्ध करते हैं?

उत्तर

113
SELECT Col.Column_Name from 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab, 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col 
WHERE 
    Col.Constraint_Name = Tab.Constraint_Name 
    AND Col.Table_Name = Tab.Table_Name 
    AND Constraint_Type = 'PRIMARY KEY' 
    AND Col.Table_Name = '<your table name>' 
+0

FYI- को खिलाने के लिए एक स्रोत से मेटाडाटा उपलब्ध कराने के लिए यह अनिवार्य रूप से कॉलम की सूची नहीं है *क्रम में*। यदि आपको अपने विशेष क्रम में कॉलम की आवश्यकता है तो इस सवाल को इसी प्रश्न के बारे में देखें: http://stackoverflow.com/a/3942921/18511 – Kip

+6

असल में, मेरा मानना ​​है कि आपको स्कीमा को भी बाध्य करना है, है ना? तो, आपको "और COL.TABLE_SCHEMA = ''" भी जोड़ना होगा। – DavidStein

+0

यदि उपरोक्त क्वेरी 3 पंक्तियों, 'ए',' बी' और 'सी', (उस क्रम में) लौटाती है तो मेरी तालिका में 'abc' की प्राथमिक समग्र कुंजी है? –

0

प्रणाली संग्रहीत प्रक्रिया sp_help आपको जानकारी देगी। निष्पादित निम्न कथन:

execute sp_help table_name 
5

का उपयोग कर रहा है एमएस एसक्यूएल सर्वर आप निम्न कर सकते हैं:

--List all tables primary keys 
select * from information_schema.table_constraints 
where constraint_type = 'Primary Key' 

तुम भी यदि आप किसी विशिष्ट तालिका चाहते TABLE_NAME स्तंभ पर फ़िल्टर कर सकते हैं।

+3

यह केवल कुंजी सूचीबद्ध करता है, यह कुंजी – Kip

+0

में कॉलम सूचीबद्ध नहीं करता है यह सही शुरुआत के लिए बंद है, लेकिन गाय स्टारबक द्वारा उत्तर में INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE के साथ जुड़ने की आवश्यकता है। – bstrong

0

इस आजमाएँ:

SELECT 
    CONSTRAINT_CATALOG AS DataBaseName, 
    CONSTRAINT_SCHEMA AS SchemaName, 
    TABLE_NAME AS TableName, 
    CONSTRAINT_Name AS PrimaryKey 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE CONSTRAINT_TYPE = 'Primary Key' and Table_Name = 'YourTable' 
0
SELECT t.name AS 'table', i.name AS 'index', it.xtype, 

(SELECT c.name FROM syscolumns c INNER JOIN sysindexkeys k 
    ON k.indid = i.indid 
     AND c.colid = k.colid 
     AND c.id = t.id 
     AND k.keyno = 1 
     AND k.id = t.id) 
    AS 'column1', 

(SELECT c.name FROM syscolumns c INNER JOIN sysindexkeys k 
    ON k.indid = i.indid 
     AND c.colid = k.colid 
     AND c.id = t.id 
     AND k.keyno = 2 
     AND k.id = t.id) 
    AS 'column2', 

(SELECT c.name FROM syscolumns c INNER JOIN sysindexkeys k 
    ON k.indid = i.indid 
     AND c.colid = k.colid 
     AND c.id = t.id 
     AND k.keyno = 3 
     AND k.id = t.id) 
    AS 'column3', 

(SELECT c.name FROM syscolumns c INNER JOIN sysindexkeys k 
    ON k.indid = i.indid 
     AND c.colid = k.colid 
     AND c.id = t.id 
     AND k.keyno = 4 
     AND k.id = t.id) 
    AS 'column4', 

(SELECT c.name FROM syscolumns c INNER JOIN sysindexkeys k 
    ON k.indid = i.indid 
     AND c.colid = k.colid 
     AND c.id = t.id 
     AND k.keyno = 5 
     AND k.id = t.id) 
    AS 'column5', 

(SELECT c.name FROM syscolumns c INNER JOIN sysindexkeys k 
    ON k.indid = i.indid 
     AND c.colid = k.colid 
     AND c.id = t.id 
     AND k.keyno = 6 
     AND k.id = t.id) 
    AS 'column6', 

(SELECT c.name FROM syscolumns c INNER JOIN sysindexkeys k 
    ON k.indid = i.indid 
     AND c.colid = k.colid 
     AND c.id = t.id 
     AND k.keyno = 7 
     AND k.id = t.id) 
    AS 'column7', 

(SELECT c.name FROM syscolumns c INNER JOIN sysindexkeys k 
    ON k.indid = i.indid 
     AND c.colid = k.colid 
     AND c.id = t.id 
     AND k.keyno = 8 
     AND k.id = t.id) 
    AS 'column8', 

(SELECT c.name FROM syscolumns c INNER JOIN sysindexkeys k 
    ON k.indid = i.indid 
     AND c.colid = k.colid 
     AND c.id = t.id 
     AND k.keyno = 9 
     AND k.id = t.id) 
    AS 'column9', 

(SELECT c.name FROM syscolumns c INNER JOIN sysindexkeys k 
    ON k.indid = i.indid 
     AND c.colid = k.colid 
     AND c.id = t.id 
     AND k.keyno = 10 
     AND k.id = t.id) 
    AS 'column10', 

FROM sysobjects t 
    INNER JOIN sysindexes i ON i.id = t.id 
    INNER JOIN sysobjects it ON it.parent_obj = t.id AND it.name = i.name 

WHERE it.xtype = 'PK' 
ORDER BY t.name, i.name 
+0

किसी कारण से मुझे कई मानों को वापस करने वाले उप प्रश्नों पर एक त्रुटि मिलती है। मैंने प्रत्येक सबक्विरीज़ को यह देखने के लिए टिप्पणी की कि क्या मैं इसे इंगित कर सकता हूं, लेकिन वे सभी एक ही टेबल पर विफल होने लगते हैं, जिसमें इसकी अनुक्रमणिका में केवल एक फ़ील्ड है। कोई विचार क्यों ऐसा होगा? – Marshall

+0

मैंने पाया कि समस्या तब थी जब एक टेबल फ़ंक्शन सूचीबद्ध था। निश्चित नहीं है कि क्यों, लेकिन फ़ील्ड को कॉलम (यानी कॉलम 1) के लिए गिना जाता है 2. मेरा फिक्स अंतिम WHERE खंड को "WHERE it.xtype = 'PK' और t। [Type] = 'U'" में बदलना था। – Marshall

+0

मैंने अपने परिणाम सेट में 'न्यूल' देखने से बचने के लिए प्रत्येक कॉलम पर इस्लाम फ़ंक्शन का उपयोग करके इसे भी पसंद किया। उदाहरण के लिए: , IsNull ( ( c.name द्वारा चुने जाने वाले syscolumns ग अंदरूनी शामिल हों sysindexkeys k पर k.indid = i.indid और c.colid = k.colid और c.id = t.id और k.keyno = 1 और k.id = t.id), ' ) AS' कॉलम 1 ' – Marshall

5

मैं INFORMATION_SCHEMA तकनीक पसंद है, लेकिन एक और मैं का उपयोग किया है है: कार्यकारी sp_pkeys 'तालिका'

1

धन्यवाद लड़का।

थोड़ी भिन्नता के साथ मैंने इसे सभी तालिकाओं के लिए सभी प्राथमिक कुंजी खोजने के लिए उपयोग किया।

SELECT A.Name,Col.Column_Name from 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab, 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col , 
    (select NAME from dbo.sysobjects where xtype='u') AS A 
WHERE 
    Col.Constraint_Name = Tab.Constraint_Name 
    AND Col.Table_Name = Tab.Table_Name 
    AND Constraint_Type = 'PRIMARY KEY ' 
    AND Col.Table_Name = A.Name 
1
SELECT A.TABLE_NAME as [Table_name], A.CONSTRAINT_NAME as [Primary_Key] 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS A, INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE B 
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND A.CONSTRAINT_NAME = B.CONSTRAINT_NAME 
4

--This एक और संशोधित संस्करण जो भी सह-संबंधित के लिए एक उदाहरण है क्वेरी

SELECT TC.TABLE_NAME as [Table_name], TC.CONSTRAINT_NAME as [Primary_Key] 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC 
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU 
ON TC.CONSTRAINT_NAME = CCU.CONSTRAINT_NAME 
WHERE TC.CONSTRAINT_TYPE = 'PRIMARY KEY' AND 
TC.TABLE_NAME IN 
(SELECT [NAME] AS [TABLE_NAME] FROM SYS.OBJECTS 
WHERE TYPE = 'U') 
3

यह सभी बाधाओं (प्राथमिक कुंजी और विदेशी कुंजी) में सूचीबद्ध करना चाहिए और कम से है क्वेरी डाल तालिका नाम के अंत

/* 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

7

यहाँ सवाल से काफी आसान तरीका है: Get table primary key using sql query:

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA+'.'+CONSTRAINT_NAME), 'IsPrimaryKey') = 1 
    AND TABLE_NAME = '<your table name>' 

यह KEY_COLUMN_USAGE का उपयोग करता है किसी तालिका के
फिर OBJECTPROPERTY(id, 'IsPrimaryKey') का उपयोग करता है, तो प्रत्येक प्राथमिक कुंजी

है निर्धारित करने के लिए बाधाओं को निर्धारित करने के लिए
1

मुझे यह उपयोगी पाया गया, कॉलम की अल्पविराम की अलग सूची के साथ तालिकाओं की एक सूची देता है और फिर एक अल्पविराम की अलग सूची भी होती है जिसमें प्राथमिक कुंजी

SELECT T.TABLE_SCHEMA, T.TABLE_NAME, 
STUFF((
    SELECT ', ' + C.COLUMN_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS C 
     WHERE C.TABLE_SCHEMA = T.TABLE_SCHEMA 
     AND T.TABLE_NAME = C.TABLE_NAME 
     FOR XML PATH ('') 
    ), 1, 2, '') AS Columns, 
STUFF((
SELECT ', ' + C.COLUMN_NAME 
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE C 
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC 
    ON C.TABLE_SCHEMA = TC.TABLE_SCHEMA 
    AND C.TABLE_NAME = TC.TABLE_NAME 
    WHERE C.TABLE_SCHEMA = T.TABLE_SCHEMA 
    AND T.TABLE_NAME = C.TABLE_NAME 
    AND TC.CONSTRAINT_TYPE = 'PRIMARY KEY' 
    FOR XML PATH ('') 
), 1, 2, '') AS [Key] 
FROM INFORMATION_SCHEMA.TABLES T 
ORDER BY T.TABLE_SCHEMA, T.TABLE_NAME 
1

यह आपको पीके के कॉलम देता है।

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'TableName' 
18

यह आम तौर पर अभ्यास अनुशंसा की जाती है अब, एसक्यूएल सर्वर में INFORMATION_SCHEMA से अधिक sys.* विचारों का उपयोग करें ताकि जब तक आप डेटाबेस मैं उन का प्रयोग करेंगे पलायन की योजना बना रहे।यहाँ कैसे आप sys.* विचारों के साथ यह करना होगा है:

SELECT 
    c.name AS column_name, 
    i.name AS index_name, 
    c.is_identity 
FROM sys.indexes i 
    inner join sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id 
    inner join sys.columns c ON ic.object_id = c.object_id AND c.column_id = ic.column_id 
WHERE i.is_primary_key = 1 
    and i.object_ID = OBJECT_ID('<schema>.<tablename>'); 
+1

ऑर्डर करने के लिए, क्वेरी में' ic.key_ordinal ASC 'द्वारा ऑर्डर करें –

11

यह एक समाधान है जो केवल sys -tables का उपयोग करता है।

यह डेटाबेस में सभी प्राथमिक कुंजी सूचीबद्ध करता है। यह प्रत्येक प्राथमिक कुंजी के लिए स्कीमा, तालिका का नाम, कॉलम नाम और सही कॉलम सॉर्ट ऑर्डर देता है।

आप एक विशिष्ट तालिका के लिए प्राथमिक कुंजी प्राप्त करना चाहते हैं, तो आप SchemaName और TableName पर फिल्टर करने के लिए की जरूरत है।

आईएमएचओ, यह समाधान बहुत सामान्य है और किसी भी स्ट्रिंग अक्षर का उपयोग नहीं करता है, इसलिए यह किसी भी मशीन पर चलाएगा।

select 
    s.name as SchemaName, 
    t.name as TableName, 
    tc.name as ColumnName, 
    ic.key_ordinal as KeyOrderNr 
from 
    sys.schemas s 
    inner join sys.tables t on s.schema_id=t.schema_id 
    inner join sys.indexes i on t.object_id=i.object_id 
    inner join sys.index_columns ic on i.object_id=ic.object_id 
            and i.index_id=ic.index_id 
    inner join sys.columns tc on ic.object_id=tc.object_id 
          and ic.column_id=tc.column_id 
where i.is_primary_key=1 
order by t.name, ic.key_ordinal ; 
+1

इच्छा है कि मैं इसे और अधिक वोट दे सकता हूं एक बार से अधिक। वास्तव में मुझे क्या चाहिए और बस समय में। – fqhv

1

क्वेरी नीचे प्राथमिक कुंजी विशेष तालिका की सूची जाएगा:

SELECT DISTINCT 
    CONSTRAINT_NAME AS [Constraint], 
    TABLE_SCHEMA AS [Schema], 
    TABLE_NAME AS TableName 
FROM 
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE 
    TABLE_NAME = 'mytablename' 
0

इस संस्करण प्रदर्शित करता है स्कीमा, टेबल नाम और एक का आदेश दिया, अल्पविराम प्राथमिक कुंजी की सूची अलग कर दिया। Object_Id() लिंक सर्वर के लिए काम नहीं करता है इसलिए हम तालिका नाम से फ़िल्टर करते हैं।

प्रतिस्थापन के बिना (Si1.Column_Name, '', '') यह उस डेटाबेस पर Column_Name के लिए xml खोलने और बंद टैग दिखाएगा जिस पर मैं परीक्षण कर रहा था। मुझे यकीन नहीं है कि डेटाबेस को 'Column_Name' के लिए प्रतिस्थापन की आवश्यकता क्यों है, इसलिए यदि कोई जानता है तो कृपया टिप्पणी करें।

DECLARE @TableName VARCHAR(100) = ''; 
WITH Sysinfo 
    AS (SELECT Kcu.Table_Name 
      , Kcu.Table_Schema AS Schema_Name 
      , Kcu.Column_Name 
      , Kcu.Ordinal_Position 
     FROM [LinkServer].Information_Schema.Key_Column_Usage Kcu 
      JOIN [LinkServer].Information_Schema.Table_Constraints AS Tc ON Tc.Constraint_Name = Kcu.Constraint_Name 
     WHERE Tc.Constraint_Type = 'Primary Key') 
    SELECT   Schema_Name 
        ,Table_Name 
        , STUFF(
          (
          SELECT ', ' 
           , REPLACE(Si1.Column_Name, '', '') 
          FROM Sysinfo Si1 
          WHERE Si1.Table_Name = Si2.Table_Name 
          ORDER BY Si1.Table_Name 
            , Si1.Ordinal_Position 
          FOR XML PATH('') 
         ), 1, 2, '') AS Primary_Keys 
    FROM Sysinfo Si2 
    WHERE Table_Name = CASE 
         WHEN @TableName NOT IN('', 'All') 
         THEN @TableName 
         ELSE Table_Name 
        END 
    GROUP BY Si2.Table_Name, Si2.Schema_Name; 

और एक ही पैटर्न जॉर्ज क्वेरी का उपयोग:

DECLARE @TableName VARCHAR(100) = ''; 
WITH Sysinfo 
    AS (SELECT S.Name AS Schema_Name 
      , T.Name AS Table_Name 
      , Tc.Name AS Column_Name 
      , Ic.Key_Ordinal AS Ordinal_Position 
     FROM [LinkServer].Sys.Schemas S 
      JOIN [LinkServer].Sys.Tables T ON S.Schema_Id = T.Schema_Id 
      JOIN [LinkServer].Sys.Indexes I ON T.Object_Id = I.Object_Id 
      JOIN [LinkServer].Sys.Index_Columns Ic ON I.Object_Id = Ic.Object_Id 
                 AND I.Index_Id = Ic.Index_Id 
      JOIN [LinkServer].Sys.Columns Tc ON Ic.Object_Id = Tc.Object_Id 
                AND Ic.Column_Id = Tc.Column_Id 
     WHERE I.Is_Primary_Key = 1) 
    SELECT   Schema_Name 
        ,Table_Name 
        , STUFF(
          (
          SELECT ', ' 
           , REPLACE(Si1.Column_Name, '', '') 
          FROM Sysinfo Si1 
          WHERE Si1.Table_Name = Si2.Table_Name 
          ORDER BY Si1.Table_Name 
            , Si1.Ordinal_Position 
          FOR XML PATH('') 
         ), 1, 2, '') AS Primary_Keys 
    FROM Sysinfo Si2 
    WHERE Table_Name = CASE 
         WHEN @TableName NOT IN('', 'All') 
         THEN @TableName 
         ELSE Table_Name 
        END 
    GROUP BY Si2.Table_Name, Si2.Schema_Name; 
0

Sys.Objects तालिका प्रत्येक उपयोगकर्ता परिभाषित, स्कीमा-दायरे वाले वस्तु के लिए पंक्ति में शामिल है। प्राथमिक कुंजी या दूसरों की तरह बनाया

प्रतिबन्ध वस्तु और तालिका नाम होगा parent_object

क्वेरी sys.Objects हो सकता है और आवश्यक की वस्तु की आईडी एकत्रित करेगा प्रकार

declare @TableName nvarchar(50)='TblInvoice' -- your table name 
declare @TypeOfKey nvarchar(50)='PK' -- For Primary key 

SELECT Name FROM sys.objects 
WHERE type = @TypeOfKey 
AND parent_object_id = OBJECT_ID (@TableName) 
1

मैं एक साधारण तकनीक बता रहा हूं जो मैं

का पालन करता हूं

इस कोड को क्वेरी के रूप में चलाएं। Table_name के स्थान पर अपना टेबल नाम बताएं जिसके लिए आप प्राथमिक कुंजी जानना चाहते हैं (सिंगल कोट्स को न भूलें)। परिणाम संलग्न छवि की तरह दिखाएगा।आशा है कि यह आप

में मदद मिलेगी

enter image description here

+0

सुनिश्चित करें कि आप अपने टेबल नाम को सिंगल कोट्स में घेर लें या कमांड काम नहीं करेगा! – Shadoninja

0

मैं नीचे

SELECT 
KEYS.table_schema, KEYS.table_name, KEYS.column_name, KEYS.ORDINAL_POSITION 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE keys 
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS CONS 
    ON cons.TABLE_SCHEMA = keys.TABLE_SCHEMA 
    AND cons.TABLE_NAME = keys.TABLE_NAME 
    AND cons.CONSTRAINT_NAME = keys.CONSTRAINT_NAME 
WHERE cons.CONSTRAINT_TYPE = 'PRIMARY KEY' 

नोट्स मूल प्रश्न के लिए एक और अधिक सटीक सरल उत्तर का सुझाव मई:

  1. जवाब में से कुछ के ऊपर एक याद कर रहे हैं केवल प्राथमिक कुंजी कॉलम के लिए फ़िल्टर करें!
  2. मैं एक बड़ा स्तंभ के लिए सूची में शामिल होने के एक CTE में नीचे का उपयोग कर रहा मचान तालिकाओं के BIML पीढ़ी और लघु उद्योगों कोड
संबंधित मुद्दे