Sql server 使用类型获取所有表键

Sql server 使用类型获取所有表键,sql-server,sql-server-2000,Sql Server,Sql Server 2000,我已设法从各种示例中拼凑出此查询,以获得所有表键: select tbl.name,idx.name as indexname,t1.*,col.name as colname from dbo.sysindexkeys as t1 LEFT JOIN dbo.sysindexes as idx on (t1.id=idx.id and t1.indid=idx.indid) LEFT JOIN dbo.syscolumns as col on (col.id=t1.id and col.col

我已设法从各种示例中拼凑出此查询,以获得所有表键:

select tbl.name,idx.name as indexname,t1.*,col.name as colname
from dbo.sysindexkeys as t1
LEFT JOIN dbo.sysindexes as idx on (t1.id=idx.id and t1.indid=idx.indid)
LEFT JOIN dbo.syscolumns as col on (col.id=t1.id and col.colid=t1.colid)
LEFT JOIN dbo.sysobjects as tbl on (idx.id=tbl.id)
ORDER BY tbl.name,idx.name,t1.keyno
我唯一需要的另一件事是键的类型,据我所知,应该是PK、UQ或D,目前与外键无关。似乎我需要再次连接sysobjects以获取xtype列,但我无法找到正确的连接方法

基于我的努力

但这会导致每个索引列有多个记录,并且具有不同的X类型。我希望每个索引列有一行如果索引在三列上,那么应该有三行都具有正确的xtype。我需要更改什么?

您可以尝试使用sysindex的状态来确定密钥类型。查询可能与以下内容有关

SELECT c.name AS [schema], a.name AS table_name, b.name AS key_name,
    CAST(CASE WHEN b.status&2048<>0 THEN 1 ELSE 0 END AS bit) AS is_PK_constraint,
    CAST(CASE WHEN b.status&4096<>0 THEN 1 ELSE 0 END AS bit) AS is_UNIQUE_constraint,
    CAST(CASE WHEN b.status&16<>0 THEN 1 ELSE 0 END AS bit) AS is_clustered,
    CAST(CASE WHEN b.status&2<>0 THEN 1 ELSE 0 END AS bit) AS is_unique_index,
    CAST(CASE WHEN b.status&64<>0 THEN 1 ELSE 0 END AS bit) AS is_allows_duplicate
FROM sysobjects a 
    INNER JOIN sysindexes b ON a.id = b.id 
    INNER JOIN sysusers c ON a.uid = c.uid 
WHERE b.status&0x800000=0 AND c.name<>'sys'
ORDER BY c.name, a.name, b.name

我希望这将在您当前使用的SQL Server 2000的追溯版本中起作用。

我进入了您的原始SQL语句,并让它从sysobjects表返回索引的xtype:

idx.id是与索引相关的表的id。sysobjects表中除了name字段之外没有任何内容与sysindexes表中的内容匹配,因此也必须加入其中。几乎进行了另一次左连接,但当我这样做时,我从索引表中获取了未在sysobjects表中列出的统计对象的行

编辑: 我回去查看了获取您正在查找的信息所需的步骤,并得出了以下SQL语句:

SELECT name, indexname, id, indid, colid, keyno, colname, 
    ISNULL(xtype, CASE WHEN is_index = 1 THEN 'IX' WHEN status&2 <> 0 THEN 'UQ' ELSE xtype END) as xtype
FROM 
(select TOP 100 PERCENT
    tbl.name,
    idx.name as indexname,
    t1.*,
    col.name as colname, 
    idx.status, 
    CAST(CASE WHEN (idx.status=0 OR idx.status&5<>0) THEN 1 ELSE 0 END AS bit) AS is_index,
    CAST(CASE WHEN idx.status&64<>0 THEN 1 ELSE 0 END AS bit) AS is_statistic,
    tbl2.xtype
from dbo.sysindexkeys as t1
LEFT JOIN dbo.sysindexes as idx on (t1.id=idx.id and t1.indid=idx.indid)
LEFT JOIN dbo.syscolumns as col on (col.id=t1.id and col.colid=t1.colid)
LEFT JOIN dbo.sysobjects as tbl on (idx.id=tbl.id)
LEFT JOIN dbo.sysobjects AS tbl2 ON (idx.id = tbl2.parent_obj) AND (idx.name = tbl2.name)
ORDER BY tbl.name,idx.name,t1.keyno) AS dts
WHERE is_statistic = 0

我不知道如何显示“D”类型,因为它们也不在sysindexkeys表中。

您使用的是哪个版本的SQL Server?所有这些视图都已弃用。选择@@版本:Microsoft SQL Server 2000-8.00.760 Intel X86 Dec 17 2002 14:22:05版权所有c 1988-2003 Microsoft Corporation桌面引擎Windows NT 5.1 Build 2600:Service Pack 2运行时,它似乎只返回主键。我没有足够的微软SQL的经验,甚至猜不出原因。在SQLServer2000中,正常索引似乎不在sysobjects表中。正因为如此,加入者将他们排除在外。不知道如何修改它以显示索引而不显示统计信息。如果将最后一个联接更改为左联接,则将获得sysindexes表中的项,即使它们不在sysobjects表中。
select tbl.name,idx.name as indexname,t1.*,col.name as colname, tbl2.xtype
from dbo.sysindexkeys as t1
LEFT JOIN dbo.sysindexes as idx on (t1.id=idx.id and t1.indid=idx.indid)
LEFT JOIN dbo.syscolumns as col on (col.id=t1.id and col.colid=t1.colid)
LEFT JOIN dbo.sysobjects as tbl on (idx.id=tbl.id)
JOIN dbo.sysobjects AS tbl2 ON (idx.id = tbl2.parent_obj) AND (idx.name = tbl2.name)
ORDER BY tbl.name,idx.name,t1.keyno
SELECT name, indexname, id, indid, colid, keyno, colname, 
    ISNULL(xtype, CASE WHEN is_index = 1 THEN 'IX' WHEN status&2 <> 0 THEN 'UQ' ELSE xtype END) as xtype
FROM 
(select TOP 100 PERCENT
    tbl.name,
    idx.name as indexname,
    t1.*,
    col.name as colname, 
    idx.status, 
    CAST(CASE WHEN (idx.status=0 OR idx.status&5<>0) THEN 1 ELSE 0 END AS bit) AS is_index,
    CAST(CASE WHEN idx.status&64<>0 THEN 1 ELSE 0 END AS bit) AS is_statistic,
    tbl2.xtype
from dbo.sysindexkeys as t1
LEFT JOIN dbo.sysindexes as idx on (t1.id=idx.id and t1.indid=idx.indid)
LEFT JOIN dbo.syscolumns as col on (col.id=t1.id and col.colid=t1.colid)
LEFT JOIN dbo.sysobjects as tbl on (idx.id=tbl.id)
LEFT JOIN dbo.sysobjects AS tbl2 ON (idx.id = tbl2.parent_obj) AND (idx.name = tbl2.name)
ORDER BY tbl.name,idx.name,t1.keyno) AS dts
WHERE is_statistic = 0