La pregunta está etiquetada como SQL Server 2000, pero para beneficio de las personas que desarrollan en la última versión, abordaré eso primero.
SQL Server 2014
Además de los métodos para agregar índices basados en restricciones que se analizan a continuación, SQL Server 2014 también permite especificar índices no únicos directamente con sintaxis en línea en las declaraciones de variables de tabla.
Ejemplo de sintaxis para eso está abajo.
/*SQL Server 2014+ compatible inline index syntax*/
DECLARE @T TABLE (
C1 INT INDEX IX1 CLUSTERED, /*Single column indexes can be declared next to the column*/
C2 INT INDEX IX2 NONCLUSTERED,
INDEX IX3 NONCLUSTERED(C1,C2) /*Example composite index*/
);
Los índices filtrados y los índices con columnas incluidas no se pueden declarar actualmente con esta sintaxis, sin embargo, SQL Server 2016 lo relaja un poco más. Desde CTP 3.1 ahora es posible declarar índices filtrados para variables de tabla. Según RTM, es posible que las columnas incluidas también estén permitidas, pero la posición actual es que "probablemente no llegarán a SQL16 debido a limitaciones de recursos".
/*SQL Server 2016 allows filtered indexes*/
DECLARE @T TABLE
(
c1 INT NULL INDEX ix UNIQUE WHERE c1 IS NOT NULL /*Unique ignoring nulls*/
)
SQL Server 2000 - 2012
¿Puedo crear un índice en Nombre?
Respuesta corta: sí.
DECLARE @TEMPTABLE TABLE (
[ID] [INT] NOT NULL PRIMARY KEY,
[Name] [NVARCHAR] (255) COLLATE DATABASE_DEFAULT NULL,
UNIQUE NONCLUSTERED ([Name], [ID])
)
Una respuesta más detallada está abajo.
Las tablas tradicionales en SQL Server pueden tener un índice agrupado o están estructuradas como montones .
Los índices agrupados pueden declararse como únicos para no permitir valores de clave duplicados o predeterminados como no únicos. Si no es único, SQL Server agrega silenciosamente un unificador a las claves duplicadas para que sean únicas.
Los índices no agrupados también se pueden declarar explícitamente como únicos. De lo contrario, para el caso no único, SQL Server agrega el localizador de filas (clave de índice agrupada o RID para un montón) a todas las claves de índice (no solo duplicados), esto nuevamente asegura que sean únicos.
En SQL Server 2000 - 2012, los índices de las variables de tabla solo se pueden crear implícitamente creando una restricción UNIQUE
o PRIMARY KEY
. La diferencia entre estos tipos de restricciones es que la clave primaria debe estar en columnas no anulables. Las columnas que participan en una restricción única pueden ser anulables. (aunque la implementación de restricciones únicas de SQL Server en presencia de NULL
s no es la especificada en el Estándar SQL). Además, una tabla solo puede tener una clave primaria pero múltiples restricciones únicas.
Ambas restricciones lógicas se implementan físicamente con un índice único. Si no se especifica explícitamente de lo contrario, PRIMARY KEY
se convertirá en el índice agrupado y las restricciones únicas no agrupadas, pero este comportamiento puede anularse especificando CLUSTERED
o NONCLUSTERED
explícitamente con la declaración de restricción (sintaxis de ejemplo)
DECLARE @T TABLE
(
A INT NULL UNIQUE CLUSTERED,
B INT NOT NULL PRIMARY KEY NONCLUSTERED
)
Como resultado de lo anterior, los siguientes índices se pueden crear implícitamente en variables de tabla en SQL Server 2000 - 2012.
+-------------------------------------+-------------------------------------+
| Index Type | Can be created on a table variable? |
+-------------------------------------+-------------------------------------+
| Unique Clustered Index | Yes |
| Nonunique Clustered Index | |
| Unique NCI on a heap | Yes |
| Non Unique NCI on a heap | |
| Unique NCI on a clustered index | Yes |
| Non Unique NCI on a clustered index | Yes |
+-------------------------------------+-------------------------------------+
El último requiere un poco de explicación. En la definición de la variable de tabla al principio de esta respuesta, el índice no agrupado no único activado Name
se simula mediante un índice único activado Name,Id
(recuerde que SQL Server agregaría silenciosamente la clave de índice agrupado a la clave NCI no exclusiva de todos modos).
También se puede lograr un índice agrupado no único agregando manualmente una IDENTITY
columna para que actúe como unificador.
DECLARE @T TABLE
(
A INT NULL,
B INT NULL,
C INT NULL,
Uniqueifier INT NOT NULL IDENTITY(1,1),
UNIQUE CLUSTERED (A,Uniqueifier)
)
Pero esta no es una simulación precisa de cómo un índice agrupado no único normalmente se implementaría en SQL Server, ya que esto agrega el "Uniqueifier" a todas las filas. No solo aquellos que lo requieren.