Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Obtener los indices y las columnas que componen dichos indices

Estas en el tema de Obtener los indices y las columnas que componen dichos indices en el foro de SQL Server en Foros del Web. Hola a todos: Espero alguien me pueda ayudar con la sentencia SQL que me permita saber que indices existen en la base de datos y ...
  #1 (permalink)  
Antiguo 09/08/2010, 14:03
 
Fecha de Ingreso: agosto-2007
Mensajes: 268
Antigüedad: 16 años, 8 meses
Puntos: 2
Obtener los indices y las columnas que componen dichos indices

Hola a todos:

Espero alguien me pueda ayudar con la sentencia SQL que me permita saber que indices existen en la base de datos y cuales son las columnas que componen dichos indices (en caso de que sean indices compuestos)

Gracias
  #2 (permalink)  
Antiguo 09/08/2010, 15:04
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Obtener los indices y las columnas que componen dichos indices

Código SQL:
Ver original
  1. DROP TABLE #tables
  2. DECLARE @tabla sysname
  3. DECLARE @record INT
  4. CREATE TABLE #tables (id INT IDENTITY PRIMARY KEY, name sysname)
  5. INSERT INTO #tables (name)
  6. SELECT name FROM sysobjects WHERE TYPE='U' ORDER BY name
  7. SET @record = 1
  8. WHILE @record <= (SELECT MAX(id) FROM #tables)
  9. BEGIN
  10. SELECT @tabla = name FROM #tables WHERE id = @record
  11. SELECT @tabla
  12. EXEC sp_helpindex @tabla
  13. SET @record = @record + 1
  14. END
  15. GO
  #3 (permalink)  
Antiguo 09/08/2010, 15:46
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Respuesta: Obtener los indices y las columnas que componen dichos indices

Esta consulta es más para confirmar y ver si es correcta que para responder el post, el compañero iislas tiene más experiencia.

Código:
SELECT 
object_name(cols.object_id) tabla
,cols.name columna
,ind.name indice
,ind.type_desc tipo
,ind.is_unique 
FROM 
sys.columns cols, sys.indexes ind , sys.index_columns ind_cols
where 
cols.object_id = ind.object_id
and cols.object_id = ind_cols.object_id
and cols.column_id = ind_cols.column_id
and ind.index_id = ind_cols.index_id
order by object_name(cols.object_id), ind.name
Saludos
  #4 (permalink)  
Antiguo 09/08/2010, 16:06
 
Fecha de Ingreso: agosto-2007
Mensajes: 268
Antigüedad: 16 años, 8 meses
Puntos: 2
Respuesta: Obtener los indices y las columnas que componen dichos indices

Hola:

Gracias a ambos por constestar. De hecho ambas opciones son buenas...lo unico que me queda duda es con la respuesta de matanga obtengo un muy buen resultado, sin embargo he estado analizando la informacion resultante y tengo un ejemplo de algo que me pasa y no sé por que.

tengo una tabla TABLA1 la cual contiene indices creados mediante la sugerencia de tunneo. Ahora bien esta tabla cuenta con 30 campos y el indice que yo veo me incluye como 5, sin embargo la consulta que me mandas me pone alrededor de 25 campos por ese indice

¿Que puede ser?
  #5 (permalink)  
Antiguo 09/08/2010, 16:15
 
Fecha de Ingreso: agosto-2007
Mensajes: 268
Antigüedad: 16 años, 8 meses
Puntos: 2
Respuesta: Obtener los indices y las columnas que componen dichos indices

O si bien saben como acceder via recordset a la informacion que me envia el comando exec sp_help 'tabla1'

Saludos...
  #6 (permalink)  
Antiguo 09/08/2010, 16:37
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Obtener los indices y las columnas que componen dichos indices

Guarda el contenido de lo que te envia el sp_helpindex

Código SQL:
Ver original
  1. DROP TABLE #tables
  2. DROP TABLE #indices
  3. DECLARE @tabla sysname
  4. DECLARE @record INT
  5. CREATE TABLE #tables (id INT IDENTITY PRIMARY KEY, name sysname)
  6. CREATE TABLE #indices (tabla VARCHAR(50), index_name sysname, index_description VARCHAR(50), index_keys VARCHAR(255))
  7. INSERT INTO #tables (name)
  8. SELECT name FROM sysobjects WHERE TYPE='U' ORDER BY name
  9. SET @record = 1
  10. WHILE @record <= (SELECT MAX(id) FROM #tables)
  11. BEGIN
  12. SELECT @tabla = name FROM #tables WHERE id = @record
  13. INSERT INTO #indices (index_name, index_description, index_keys)
  14. EXEC sp_helpindex @tabla
  15. UPDATE #indices SET [tabla] = @tabla
  16. SET @record = @record + 1
  17. END
  18. GO
  19.  
  20. -- al final solo haces un select a la tabla #indices
  21. SELECT * FROM #indices
  #7 (permalink)  
Antiguo 10/08/2010, 10:59
 
Fecha de Ingreso: agosto-2007
Mensajes: 268
Antigüedad: 16 años, 8 meses
Puntos: 2
Respuesta: Obtener los indices y las columnas que componen dichos indices

Hola IIslas:

Muchas gracias por contestar, en efecto el procedimiento que me enviaste funciona, salvo que tiene el detalle que en valor de tabla pone siempre el ultimo registro encontrado. Asi que me di a la tarea de seguir buscando, en base a lo que tu me escribiste y lo que encontre fue esto:

DECLARE @IndexInfoTemp TABLE (index_name varchar(250)
,index_description varchar(250)
,index_keys varchar(250)
)

DECLARE @IndexInfo TABLE (table_name sysname
,index_name varchar(250)
,index_description varchar(250)
,index_keys varchar(250)
)

DECLARE @Tables Table (RowID int not null identity(1,1)
,TableName sysname
)
DECLARE @MaxRow int
DECLARE @CurrentRow int
DECLARE @CurrentTable sysname

INSERT INTO @Tables
SELECT
DISTINCT t.name
FROM sys.indexes i
INNER JOIN sys.tables t ON i.object_id = t.object_id
WHERE i.Name IS NOT NULL
SELECT @MaxRow=@@ROWCOUNT,@CurrentRow=1

WHILE @CurrentRow<=@MaxRow
BEGIN
SELECT @CurrentTable=TableName FROM @Tables WHERE RowID=@CurrentRow
INSERT INTO @IndexInfoTemp
exec sp_helpindex @CurrentTable
INSERT INTO @IndexInfo
(table_name , index_name , index_description , index_keys)
SELECT
@CurrentTable , index_name , index_description , index_keys
FROM @IndexInfoTemp
DELETE FROM @IndexInfoTemp
SET @CurrentRow=@CurrentRow+1
END --WHILE

SELECT table_name AS [Table] , index_keys AS [ColumnName],index_name,index_description
FROM @IndexInfo

Funciona a la perfeccion por lo menos para lo que yo estaba buscando, de verdad gracias

Saludos...

Etiquetas: columnas, indices
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:01.