2011-12-07 25 views
7

Como la mayoría de las personas que trabajan con conocimientos de SQL Server, puede declarar una tabla temporal de este modo:¿Dinámicamente nombrar índices en SQL Server 2005?

create table #foo 
    (
    row_id int identity not null primary key, 
    bar varchar(50) not null default 'YoMomma' 
    ); 

... Esto creará una clave principal y una restricción predeterminada en esta tabla temporal; los nombres para estos objetos serán únicos, dinámicamente creados por el servidor Sql.

¿Es posible crear un índice denominado dinámicamente para la tabla después de que se ha creado? Tengo un caso en el que un procedimiento almacenado que utiliza tablas temporales puede ejecutar varias instancias al mismo tiempo, y me gustaría aumentar el rendimiento sin poner en riesgo un conflicto entre objetos con nombres idénticos en la base de datos tempdb. El comando CREATE INDEX requiere un nombre de índice explícito.

Estoy buscando una solución que no involucre SQL dinámico, solo nombres dinámicos.

Respuesta

14

Este es un tema que no. Los nombres de índice no tienen que ser únicos. Solo los nombres de restricción lo hacen.

Así, por ejemplo, puede ejecutar esto en múltiples conexiones simultáneas sin problemas

CREATE TABLE #T 
(
C INT 
) 

CREATE UNIQUE CLUSTERED INDEX ix on #T(C) 

Pero esto sería fallar bajo concurrencia

ALTER TABLE #T 
ADD CONSTRAINT UQ UNIQUE NONCLUSTERED (C) 
+3

Hmmm ... 10 años trabajando con SQL Server, y eso nunca lo supe. Simplemente asumí que los índices se trataron como objetos similares a las restricciones, pero lo probé y verifiqué que no hay conflicto. ¡Buena información! –

+2

@JeremyHolovacs - las restricciones obtienen los metadatos almacenados en 'sys.objects', que supongo que es la razón del requisito de exclusividad, pero los índices no. –

+1

+1 Bien, estaba bajo la misma suposición que @JeremyHolovacs – Yuck

1

debe ser capaz de hacer:

CREATE INDEX #foo1 ON #foo(bar); 
+0

Esto ciertamente parece ser la respuesta. ¡Gracias! –

+0

Perdón, tuve que cambiar la respuesta a @MartinSmith ... su respuesta fue más precisa. –

+0

No hay problema, me alegro de que hayas encontrado una solución ... Además, me gusta Martin – Sparky

Cuestiones relacionadas