Se presenta el script para obtener todos los campos de una tabla y saber cual(es) de ellos son llave primaria
declare @tabla sysname set @tabla = 'mitabla' --El nombre de la tabla que se quiere evaluar ;With PrimaryKeys (object_id, column_id) as ( SELECT 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 and ic.OBJECT_ID = OBJECT_ID(@tabla,N'U') ) select name, case when PrimaryKeys.object_id is null then 0 else 1 end IsKey from sys.columns AS C left join PrimaryKeys ON c.object_id = PrimaryKeys.object_id and c.column_id = PrimaryKeys.column_id where c.OBJECT_ID = OBJECT_ID(@tabla,N'U')
Obsérvese que se usa la función OBJECT_ID para obtener el Id del Objeto que se quiere evaluar, otra opción sería:
OBJECT_NAME(ic.OBJECT_ID) = @Tabla
pero es mas eficiente como se presenta en la consulta superior dado que sólo se ejecuta una vez la función escalar OBJECT_ID en lugar de una vez por cada registro, se observa también el uso de una instrucción CTE para calcular las llaves de la tabla
Los comentarios son bienvenidos, espero sea de ayuda,