首页 / 知识

如何列出SQL Server表的主键?

2023-04-17 08:29:00

How do you list the primary key of a SQL Server table?

一个简单的问题,如何使用T-SQL列出表的主键? 我知道如何获取表上的索引,但不记得如何获取PK。


1
2
3
4
5
6
7
8
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>'

现在通常建议在SQL Server中在INFORMATION_SCHEMA上使用sys.*视图,因此,除非您打算迁移数据库,否则我将使用这些视图。使用sys.*视图的方法如下:

1
2
3
4
5
6
7
8
9
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>');

这是仅使用sys-tables的解决方案。

它列出了数据库中的所有主键。它为每个主键返回架构,表名,列名和正确的列排序顺序。

如果要获取特定表的主键,则需要在SchemaNameTableName上进行过滤。

恕我直言,此解决方案非常通用,并且不使用任何字符串文字,因此它将在任何计算机上运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 ;

这是使用sql查询问题获取表主键的另一种方法:

1
2
3
4
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')确定每个键是否为主键


使用MS SQL Server,您可以执行以下操作:

1
2
3
--List all tables primary keys
SELECT * FROM information_schema.table_constraints
WHERE constraint_type = 'Primary Key'

如果需要特定的表,也可以在table_name列上进行过滤。


我喜欢INFORMATION_SCHEMA技术,但是我使用的另一种技术是:
exec sp_pkeys'表'


-这是另一个修改版本,也是相关查询的示例

1
2
3
4
5
6
7
8
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')

这应该列出所有约束(主键和外键),并在查询末尾放置表名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/* 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


谢了,兄弟们。

略有变化,我用它来查找所有表的所有主键。

1
2
3
4
5
6
7
8
9
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
2
3
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

系统存储过程sp_help将为您提供信息。执行以下语句:

1
EXECUTE sp_help TABLE_NAME

此列为您提供了PK列。

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

下面的查询将列出特定表的主键:

1
2
3
4
5
6
7
8
SELECT DISTINCT
    CONSTRAINT_NAME AS [CONSTRAINT],
    TABLE_SCHEMA AS [Schema],
    TABLE_NAME AS TableName
FROM
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
    TABLE_NAME = 'mytablename'

我告诉一个简单的技术,我遵循

1
SP_HELP 'table_name'

运行此代码作为查询。在要知道其主键的table_name位置提及您的表名(不要忘记单引号)。结果将显示为附件图像。希望对您有帮助

enter image description here


对于给定的TableName和Schema,以逗号分隔的主键列列表:

1
2
3
4
5
6
SELECT DISTINCT SUBSTRING ( stuff(( SELECT DISTINCT ',' + [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'  
                                    ORDER BY 1 FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,0,'' )
                            ,2,9999)

此版本显示模式,表名以及以逗号分隔的有序主键列表。 Object_Id()对链接服务器不起作用,因此我们按表名进行过滤。

没有REPLACE(Si1.Column_Name,``,''),它将在我正在测试的数据库上显示Column_Name的xml开头和结尾标记。我不确定为什么数据库需要替换" Column_Name",所以如果有人知道,请发表评论。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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;

和使用乔治查询的相同模式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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;

Sys.Objects Table contains row for each user-defined, schema-scoped
object .

Constraints created like Primary Key or others will be the object and
Table name will be the parent_object

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

1
2
3
4
5
6
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
2
3
4
5
6
7
8
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'

笔记:

  • 上面的一些答案缺少仅针对主键的过滤器
    列!
  • 我在CTE中使用以下内容加入较大的专栏
    列出以提供源中的元数据,以提供过渡表和SSIS代码的BIML生成

  • 可能会在最近发布,但希望这可以通过使用以下t-sql查询来帮助某人查看sql server中的主键列表:

    1
    2
    3
    4
    5
    6
    7
    8
    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'

    如果需要,可以使用此查询查看所有外键的列表:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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


    我从朋友那里发现了这一点,如果您要在特定模式下查找表的所有主键,这将非常有效。

    1
    2
    3
    4
    5
    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='<SCHEMA_NAME>'

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    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

    试试看:

    1
    2
    3
    4
    5
    6
    7
    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'

    如果您要执行自己的ORM或从给定表中生成代码,则可能是您正在寻找的形式:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    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
            tc.table_name=@TABLE
            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 TABLE_NAME=@TABLE
        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

    结果如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
                    <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>


    如果需要主键和类型,此查询可能有用:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT L.TABLE_SCHEMA, L.TABLE_NAME, L.COLUMN_NAME, R.TypeName
    FROM(
        SELECT COLUMN_NAME, TABLE_NAME, TABLE_SCHEMA
        FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
        WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + QUOTENAME(CONSTRAINT_NAME)), 'IsPrimaryKey') = 1
    )L
    LEFT JOIN (
        SELECT
        OBJECT_NAME(c.OBJECT_ID) TableName ,c.name AS ColumnName ,t.name AS TypeName
        FROM sys.columns AS c
        JOIN sys.types AS t ON c.user_type_id=t.user_type_id
    )R ON L.COLUMN_NAME = R.ColumnName AND L.TABLE_NAME = R.TableName


    我发现这很有用,它给出了一个表列表,并用逗号分隔了各列,然后又用逗号分隔了其中的几列是主键

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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

    主键索引列出但不

    最新内容

    相关内容

    猜你喜欢