كيف تقوم بإدراج المفتاح الأساسي في جدول SQL Server؟

سؤال بسيط ، كيف تسرد المفتاح الأساسي للجدول مع T-SQL؟ أعرف كيفية الحصول على فهارس على جدول ، ولكن لا أتذكر كيفية الحصول على PK.

0
وأضاف تحرير
الآراء: 12

22 إجابة

لقد وجدت هذا مفيدًا ، ويعطي قائمة بالجداول مع قائمة فاصلة منفصلة للأعمدة ثم قائمة مفصولة بفواصل منها المفاتيح الأساسية

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
0
وأضاف

فيما يلي طريقة أخرى من السؤال الحصول على المفتاح الأساسي للجدول باستخدام استعلام sql :

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

ويستخدم KEY_COLUMN_USAGE لتحديد القيود لجدول معين ثم يستخدم OBJECTPROPERTY ( id ، 'IsPrimary المفتاح ') لتحديد ما إذا كان كل منهما مفتاح أساسي

0
وأضاف

يستخدم MS SQL Server يمكنك القيام بما يلي:

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

يمكنك أيضًا التصفية في عمود table_name إذا كنت تريد جدولًا محددًا.

0
وأضاف
هذا يسرد فقط المفتاح ، فإنه لا يسرد الأعمدة في المفتاح
وأضاف المؤلف Kip, مصدر
هذا إيقاف إلى البداية الصحيحة ، ولكن يجب أن يكون انضم مع INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE كما هو الحال في الجواب من قبل Guy Starbuck.
وأضاف المؤلف bstrong, مصدر

سيوفر لك الإجراء المخزن للنظام sp_help المعلومات. تنفيذ العبارة التالية:

execute sp_help table_name
0
وأضاف

هذا هو الحل الذي يستخدم فقط تميز الكلية .

يسرد كافة المفاتيح الأساسية في قاعدة البيانات. تقوم بإرجاع المخطط واسم الجدول واسم العمود و ترتيب فرز الأعمدة الصحيح لكل مفتاح أساسي.

إذا كنت ترغب في الحصول على المفتاح الأساسي لجدول معين ، فستحتاج إلى التصفية على SchemaName و TableName .

IMHO ، هذا الحل هو عام جدا ولا يستخدم أي حرفي سلسلة ، لذلك سيتم تشغيله على أي جهاز.

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 ;
0
وأضاف
أتمنى أن أتمكن من التصويت هذا أكثر من مرة. بالضبط ما احتاجه وفقط في الوقت المناسب.
وأضاف المؤلف fqhv, مصدر

تعجبني تقنية INFORMATION_SCHEMA ، لكن هناك طريقة أخرى استخدمتها هي: exec sp_pkeys 'table'

0
وأضاف

يعرض هذا الإصدار المخطط واسم الجدول وقائمة مرتبة مفصولة بفواصل من المفاتيح الأساسية. لا يعمل Object_Id() لملقمات الارتباط حتى نقوم بالتصفية حسب اسم الجدول.

بدون REPLACE (Si1.Column_Name، ''، '') فإنه سيتم إظهار علامات فتح وإغلاق xml لـ Column_Name في قاعدة البيانات التي كنت عليها اختبار. لست متأكدًا من سبب حاجة قاعدة البيانات إلى استبدال "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
وأضاف

جرب هذه المحاولة:

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
وأضاف

من الموصى به بشكل عام الآن استخدام طرق sys. * عبر INFORMATION_SCHEMA في SQL Server ، لذا ما لم تكن تخطط لترحيل قواعد البيانات ، فسوف أستخدمها. إليك كيفية القيام بذلك باستخدام طرق 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('.<tablename>');
0
وأضاف
للطلب ، أضف "ORDER BY ic.key_ordinal ASC" إلى الاستعلام
وأضاف المؤلف Ruud van de Beeten, مصدر

Sys.Objects يحتوي الجدول على صف لكل تعريف مخطط من قبل المستخدم   الكائن.

     

القيود التي يتم إنشاؤها مثل المفتاح الأساسي أو الآخرين ستكون كائن و   سيكون اسم الجدول parent_object

     

sery.Objects and collect the Object's Ids of Required Type

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)
0
وأضاف
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 = ''
0
وأضاف
إذا قام الاستعلام أعلاه بإرجاع 3 صفوف ، a ، b و c ، (بهذا الترتيب) ، فسيحتوي الجدول الخاص بي على مفتاح مركب أساسي من < كود> حروف </القانون>؟
وأضاف المؤلف Kevin Meredith, مصدر
في الواقع ، أعتقد أن عليك أيضًا تقييد مخطط ، أليس كذلك؟ لذلك ، ستحتاج إلى إضافة "و COL.TABLE_SCHEMA = '<�اسم مخططك>" "أيضًا.
وأضاف المؤلف DavidStein, مصدر
لم يذكر هذا FYI- بالضرورة الأعمدة بالترتيب . اطلع على هذه الإجابة على سؤال مماثل إذا كنت بحاجة إلى الأعمدة بترتيبها الخاص: stackoverflow.com/a/3942921/18511
وأضاف المؤلف Kip, مصدر

شكرا يارجل.

مع اختلاف طفيف اعتدت عليه للعثور على جميع المفاتيح الأساسية لجميع الجداول.

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
0
وأضاف
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
0
وأضاف

- هذا هو نسخة أخرى معدلة والتي تعتبر أيضا مثالا على الاستعلام المشترك

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')
0
وأضاف

يجب أن يدرج هذا جميع القيود (المفتاح الأساسي والمفاتيح الخارجية) وفي نهاية الاستعلام يضع اسم الجدول

/* 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 كوم/ب/sqltips/أرشيف/2005/09/16/469136.aspx

0
وأضاف

هذا واحد يمنحك الأعمدة التي PK.

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'TableName'
0
وأضاف

في ما يلي طلب البحث مفاتيح أساسية الخاصة بـ جدول معين :

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
وأضاف

أنا أخبر تكنيك بسيط أتبعه

SP_HELP 'table_name'

تشغيل هذا الرمز كاستعلام. أذكر اسم الجدول الخاص بك في مكان table_name الذي تريد معرفته المفتاح الأساسي (لا تنسى علامات الاقتباس المفردة). سوف تظهر النتيجة مثل الصورة المرفقة. أتمنى أنها تساعدك

enter image description here

0
وأضاف
تأكد من قيامك بإحاطة اسم الجدول الخاص بك بعلامات اقتباس مفردة وإلا فلن يعمل الأمر!
وأضاف المؤلف Shadoninja, مصدر

هل لي أن أقترح إجابة بسيطة أكثر دقة على السؤال الأصلي أدناه

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 إنشاء جداول التدريج ورمز SSIS
0
وأضاف

قد يتم نشرها مؤخرًا ولكن نأمل أن يساعد هذا شخصًا على عرض قائمة المفتاح الأساسي في خادم SQL باستخدام استعلام t-sql هذا:

SELECT  schema_name(t.schema_id) AS [schema_name], t.name AS TableName,        
    COL_NAME(ic.OBJECT_ID,ic.column_id) AS PrimaryKeyColumnName,
    i.name AS PrimaryKeyConstraintName
FROM    sys.tables t 
INNER JOIN sys.indexes AS i  on t.object_id=i.object_id 
INNER JOIN  sys.index_columns AS ic ON  i.OBJECT_ID = ic.OBJECT_ID
                            AND i.index_id = ic.index_id 
WHERE OBJECT_NAME(ic.OBJECT_ID) = 'YourTableNameHere'

يمكنك الاطلاع على قائمة بجميع المفاتيح الخارجية باستخدام هذا الاستعلام إذا كنت ترغب في:

SELECT
f.name as ForeignKeyConstraintName
,OBJECT_NAME(f.parent_object_id) AS ReferencingTableName
,COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ReferencingColumnName
,OBJECT_NAME (f.referenced_object_id) AS ReferencedTableName
,COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS 
 ReferencedColumnName  ,delete_referential_action_desc AS 
DeleteReferentialActionDesc ,update_referential_action_desc AS 
UpdateReferentialActionDesc
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc
ON f.object_id = fc.constraint_object_id
 --WHERE OBJECT_NAME(f.parent_object_id) = 'YourTableNameHere' 
 --If you want to know referecing table details 
 WHERE OBJECT_NAME(f.referenced_object_id) = 'YourTableNameHere' 
 --If you want to know refereced table details 
ORDER BY f.name
0
وأضاف

لقد عثرت على هذا من صديقي ، وهو فعال للغاية إذا كنت تبحث عن المفاتيح الأساسية للجدول تحت مخطط معين.

SELECT tc.constraint_name AS IndexName,tc.table_name AS TableName,tc.table_schema
AS SchemaName,kc.column_name AS COLUMN_NAME
FROM information_schema.table_constraints tc,information_schema.key_column_usage kc
WHERE tc.constraint_type = 'PRIMARY KEY' AND kc.table_name = tc.table_name AND kc.table_schema = tc.table_schema
AND kc.constraint_name = tc.constraint_name AND tc.table_schema=''
0
وأضاف

إذا كنت تتطلع إلى إجراء ORM الخاص بك أو إنشاء رمز من جدول معين ، فقد يكون هذا ما تبحث عنه:

declare @table varchar(100) = 'mytable';

with cte as
(
    select 
        tc.CONSTRAINT_SCHEMA
        , tc.CONSTRAINT_TYPE
        , tc.TABLE_NAME
        , ccu.COLUMN_NAME
        , IS_NULLABLE
        , DATA_TYPE
        , CHARACTER_MAXIMUM_LENGTH
        , NUMERIC_PRECISION
    from 
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
        inner join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu on tc.TABLE_NAME=ccu.TABLE_NAME  and tc.TABLE_SCHEMA=ccu.TABLE_SCHEMA
        inner join information_schema.COLUMNS c on ccu.COLUMN_NAME=c.COLUMN_NAME and ccu.TABLE_NAME=c.TABLE_NAME and ccu.TABLE_SCHEMA=c.TABLE_SCHEMA
    where 
        [email protected]
        and 
        ccu.CONSTRAINT_NAME=tc.CONSTRAINT_NAME
    union 
    select TABLE_SCHEMA,'COLUMN', TABLE_NAME, COLUMN_NAME, IS_NULLABLE, DATA_TYPE,CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION from INFORMATION_SCHEMA.COLUMNS where [email protected]
    and COLUMN_NAME not in (select COLUMN_NAME from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE where TABLE_NAME = @table)
)
select 
    cast(iif(CONSTRAINT_TYPE='PRIMARY KEY',1,0) as bit) PrimaryKey
    ,cast(iif(CONSTRAINT_TYPE='FOREIGN KEY',1,0) as bit) ForeignKey
    ,cast(iif(CONSTRAINT_TYPE='COLUMN',1,0) as bit) NotKey
    ,COLUMN_NAME
    ,cast(iif(is_nullable='NO',0,1) as bit) IsNullable
    , DATA_TYPE
    , CHARACTER_MAXIMUM_LENGTH
    , NUMERIC_PRECISION 
from 
    cte 
order by 
    case CONSTRAINT_TYPE 
        when 'PRIMARY KEY' then 1 
        when 'FOREIGN KEY' then 2 
        else 3 end
    , COLUMN_NAME

هذا ما ستبدو عليه النتيجة:

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

                            <table cellspacing=0 border=1>
                                        <tr>
                                                <td style=min-width:50px>PrimaryKey</td>
                                                <td style=min-width:50px>ForeignKey</td>
                                                <td style=min-width:50px>NotKey</td>
                                                <td style=min-width:50px>COLUMN_NAME</td>
                                                <td style=min-width:50px>IsNullable</td>
                                                <td style=min-width:50px>DATA_TYPE</td>
                                                <td style=min-width:50px>CHARACTER_MAXIMUM_LENGTH</td>
                                                <td style=min-width:50px>NUMERIC_PRECISION</td>
                                        </tr>
                                        <tr>
                                                <td style=min-width:50px>1</td>
                                                <td style=min-width:50px>0</td>
                                                <td style=min-width:50px>0</td>
                                                <td style=min-width:50px>LectureNoteID</td>
                                                <td style=min-width:50px>0</td>
                                                <td style=min-width:50px>int</td>
                                                <td style=min-width:50px>NULL</td>
                                                <td style=min-width:50px>10</td>
                                        </tr>
                                        <tr>
                                                <td style=min-width:50px>0</td>
                                                <td style=min-width:50px>1</td>
                                                <td style=min-width:50px>0</td>
                                                <td style=min-width:50px>LectureId</td>
                                                <td style=min-width:50px>0</td>
                                                <td style=min-width:50px>int</td>
                                                <td style=min-width:50px>NULL</td>
                                                <td style=min-width:50px>10</td>
                                        </tr>
                                        <tr>
                                                <td style=min-width:50px>0</td>
                                                <td style=min-width:50px>1</td>
                                                <td style=min-width:50px>0</td>
                                                <td style=min-width:50px>NoteTypeID</td>
                                                <td style=min-width:50px>0</td>
                                                <td style=min-width:50px>int</td>
                                                <td style=min-width:50px>NULL</td>
                                                <td style=min-width:50px>10</td>
                                        </tr>
                                        <tr>
                                                <td style=min-width:50px>0</td>
                                                <td style=min-width:50px>0</td>
                                                <td style=min-width:50px>1</td>
                                                <td style=min-width:50px>Body</td>
                                                <td style=min-width:50px>0</td>
                                                <td style=min-width:50px>nvarchar</td>
                                                <td style=min-width:50px>-1</td>
                                                <td style=min-width:50px>NULL</td>
                                        </tr>
                                        <tr>
                                                <td style=min-width:50px>0</td>
                                                <td style=min-width:50px>0</td>
                                                <td style=min-width:50px>1</td>
                                                <td style=min-width:50px>DisplayOrder</td>
                                                <td style=min-width:50px>0</td>
                                                <td style=min-width:50px>int</td>
                                                <td style=min-width:50px>NULL</td>
                                                <td style=min-width:50px>10</td>
                                        </tr>
                                </table>
                                
</div> </div>
0
وأضاف