我有一张包含主键 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')
非常感谢任何帮助。
答案 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'