A pergunta está marcada como SQL Server 2000, mas, para o benefício das pessoas que desenvolvem a versão mais recente, abordarei isso primeiro.
SQL Server 2014
Além dos métodos de adição de índices baseados em restrições discutidos abaixo, o SQL Server 2014 também permite que índices não exclusivos sejam especificados diretamente com sintaxe embutida nas declarações de variáveis da tabela.
Sintaxe de exemplo para isso está abaixo.
/*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*/
);
No momento, os índices filtrados e os índices com colunas incluídas não podem ser declarados com esta sintaxe, mas o SQL Server 2016 relaxa um pouco mais. A partir do CTP 3.1, agora é possível declarar índices filtrados para variáveis de tabela. Por RTM, pode ser que as colunas incluídas também sejam permitidas, mas a posição atual é que elas "provavelmente não entrarão no SQL16 devido a restrições 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
Posso criar um índice em Nome?
Resposta curta: Sim.
DECLARE @TEMPTABLE TABLE (
[ID] [INT] NOT NULL PRIMARY KEY,
[Name] [NVARCHAR] (255) COLLATE DATABASE_DEFAULT NULL,
UNIQUE NONCLUSTERED ([Name], [ID])
)
Uma resposta mais detalhada está abaixo.
As tabelas tradicionais no SQL Server podem ter um índice em cluster ou estão estruturadas como heaps .
Os índices clusterizados podem ser declarados como exclusivos para desaprovar valores de chave duplicados ou padrão para não exclusivos. Se não for exclusivo, o SQL Server adiciona silenciosamente um exclusivo a qualquer chave duplicada para torná-las exclusivas.
Os índices não agrupados também podem ser declarados explicitamente como exclusivos. Caso contrário, no caso não exclusivo, o SQL Server adiciona o localizador de linhas (chave de índice em cluster ou RID para um heap) a todas as chaves de índice (não apenas duplicatas), novamente isso garante que elas sejam exclusivas.
Em SQL Server 2000 - 2012 índices em variáveis de tabela só pode ser criado implicitamente criando um UNIQUE
ou PRIMARY KEY
restrição. A diferença entre esses tipos de restrições é que a chave primária deve estar em colunas não anuláveis. As colunas que participam de uma restrição exclusiva podem ser anuláveis. (embora a implementação do SQL Server de restrições exclusivas na presença deNULL
s não seja a especificada no SQL Standard). Além disso, uma tabela pode ter apenas uma chave primária, mas várias restrições exclusivas.
Essas duas restrições lógicas são fisicamente implementadas com um índice exclusivo. Se não especificado explicitamente, PRIMARY KEY
ele se tornará o índice clusterizado e as restrições exclusivas não clusterizadas, mas esse comportamento poderá ser substituído, especificando CLUSTERED
ou NONCLUSTERED
explicitamente com a declaração de restrição (sintaxe de exemplo)
DECLARE @T TABLE
(
A INT NULL UNIQUE CLUSTERED,
B INT NOT NULL PRIMARY KEY NONCLUSTERED
)
Como resultado do acima, os seguintes índices podem ser criados implicitamente em variáveis de tabela no 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 |
+-------------------------------------+-------------------------------------+
O último requer um pouco de explicação. Na definição da variável de tabela no início desta resposta, o índice não exclusivo não clusterizado Name
é simulado por um índice exclusivoName,Id
(lembre-se de que o SQL Server adicionaria silenciosamente a chave de índice clusterizado à chave NCI não exclusiva).
Um índice clusterizado não exclusivo também pode ser alcançado adicionando manualmente uma IDENTITY
coluna para atuar como um identificador exclusivo.
DECLARE @T TABLE
(
A INT NULL,
B INT NULL,
C INT NULL,
Uniqueifier INT NOT NULL IDENTITY(1,1),
UNIQUE CLUSTERED (A,Uniqueifier)
)
Mas essa não é uma simulação precisa de como um índice clusterizado não exclusivo seria realmente implementado no SQL Server, pois isso adiciona o "Uniqueifier" a todas as linhas. Não apenas aqueles que precisam.