如何查找SQL Server列是否是单个SQL语句中的主键?

时间:2016-09-28 22:08:21

标签: sql sql-server tsql

我有一张包含主键 Id 的表格:

NaN

我可以使用以下查询获取所有列详细信息:

IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='Person' AND xtype='U')
    CREATE TABLE Person (
    Id INT PRIMARY KEY NOT NULL, 
    Name NVARCHAR(50) NOT NULL,
    Age INTEGER NOT NULL);
GO

我也可以使用以下方法获取所有主键:

SELECT 
    so.name AS TableName,
    sc.colid AS Id, sc.name AS Name,
    sc.xtype AS TypeId, sc.prec AS Precision, sc.scale AS Scale,
    sc.iscomputed AS IsComputed,
    sc.isnullable AS IsNullable,
    sc.collation AS Collation
FROM syscolumns sc
JOIN sysobjects so ON sc.id = so.id
WHERE so.xtype = 'U' AND so.name = 'Person'

但我无法弄清楚如何将它们全部组合在一起,以便我可以使用简单的 bool 甚至 1 0 <有效地进行单个查询/ em>指示列是否为主键的标志。

类似的东西:

SELECT * 
FROM sysobjects so 
WHERE xtype = 'PK' 
AND so.parent_obj IN (SELECT id FROM sysobjects WHERE xtype = 'U' AND name = 'Person')

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

你可以试试这个 - 它通过sys.key_constraints找到合适的索引并使用sys.index_columns来识别索引中的列

SELECT 
    so.name AS TableName,
    sc.colid AS Id,
    sc.name AS Name,
    sc.xtype AS TypeId,
    sc.prec AS Precision,
    sc.scale AS Scale,
    sc.iscomputed AS IsComputed,
    sc.isnullable AS IsNullable,
    sc.collation AS Collation,
    (   select count(*) from sys.key_constraints kc
        inner join sys.indexes i on i.name = kc.name
        inner join sys.index_columns ic on ic.object_id = kc.parent_object_id and ic.index_id = i.index_id
        where kc.type = 'PK' and kc.parent_object_id = so.id and ic.column_id = sc.colid ) as IsPrimaryKey

FROM syscolumns sc
JOIN sysobjects so ON sc.id = so.id
WHERE so.xtype = 'U'
AND so.name = 'Person'

输出结果为:

TableName   Id  Name    TypeId  Precision   Scale   IsComputed  IsNullable  Collation               IsPrimaryKey
Person      1   Id          56      10          0       0               0    NULL                   1
Person      2   Name        231     50          NULL    0               0    Latin1_General_CI_AS   0
Person      3   Age         56      10          0       0               0    NULL                   0

答案 1 :(得分:0)

试试这个

SELECT 
    sc.id, 
    so.name AS TableName,
    sc.colid AS Id,
    sc.name AS Name,
    sc.xtype AS TypeId,
    sc.prec AS Precision,
    sc.scale AS Scale,
    sc.iscomputed AS IsComputed,
    sc.isnullable AS IsNullable,
    sc.collation AS Collation,
    cast (case when so1.xtype = 'pk' then 1 else 0 end as bit) as IsPrimaryColumn
FROM syscolumns sc
inner JOIN sysobjects so ON sc.id = so.id
left join sysobjects so1 on sc.id = so1.parent_obj and sc.colid = so1.uid and so1.xType = 'PK'
WHERE 
    so.xtype = 'U'  AND --so1.xtype = 'PK' and
    so.name = 'Person'