2011-03-17 117 views
2
SELECT [name] 
FROM syscolumns 
WHERE [id] IN (SELECT [id] 
        FROM sysobjects 
       WHERE [name] = 'ACTIVITY') 
    AND colid IN (SELECT SIK.colid 
        FROM sysindexkeys SIK 
        JOIN sysobjects SO ON SIK.[id] = SO.[id] 
        AND SO.[name] = 'ACTIVITY') 

它通过id返回所有列。我只需要主键。当我添加以下行时,它是空的:通过查询获取表主键列

    WHERE SIK.indid = 1 

这是为什么?还有其他方法可以做同样的事情吗?因为我在抢

+0

'indid = 1'只会提供有关表上聚簇索引的信息(如果有)。不能保证主键和聚簇索引是相同的东西。 – 2011-03-17 10:07:06

回答

2

试试这个:

Declare @TableName varchar(128) 

Set @TableName = 'YourTableName' 

SELECT c.COLUMN_NAME as [PrimaryKeyColumns] 

FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk ,    
     INFORMATION_SCHEMA.KEY_COLUMN_USAGE c  
WHERE pk.TABLE_NAME = @TableName  
AND  CONSTRAINT_TYPE = 'PRIMARY KEY'  
AND  c.TABLE_NAME = pk.TABLE_NAME  
AND  c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME 
0

这个SQL会发现所有的表与主键:

SELECT 
    i.name AS IndexName, 
    OBJECT_NAME(ic.OBJECT_ID) AS TableName, 
    COL_NAME(ic.OBJECT_ID,ic.column_id) AS ColumnName 
FROM 
    sys.indexes AS i 
    INNER JOIN sys.index_columns AS ic 
     ON i.OBJECT_ID = ic.OBJECT_ID 
     AND i.index_id = ic.index_id 
WHERE 
    i.is_primary_key = 1 

我从here得到它。还有一些其他示例here

0

这是我用来返回SQL Server中的表的主键的SQL。

DECLARE @TableSchema varchar(255) 
SET @TableSchema = 'dbo' 
SET @TableName = 'table_name_here' 

SELECT 
    ColumnName = col.column_name 
FROM  
    information_schema.table_constraints tc    
    INNER JOIN information_schema.key_column_usage col 
     ON col.Constraint_Name = tc.Constraint_Name 
     AND col.Constraint_schema = tc.Constraint_schema  
WHERE 
    tc.Constraint_Type = 'Primary Key' 
    AND col.Table_name = @TableName 
    AND col.Table_Schema = @TableSchema