2010-09-12 4 views
14

J'utilise SQL Server 2008.SQL Server 2008 - HashBytes colonne calculée

J'ai une colonne appelée Titre NVARCHAR (MAX) et je veux ajouter un index unique pour elle. Étant donné que la colonne est supérieure à 900 octets, j'ai décidé de créer une colonne calculée HashBytes (basée sur la recommandation sur StackOverflow).

Comment créer la colonne HashBytes?

alter table Softs add TitleHash AS (hashbytes('SHA1',[Title])) PERSISTED;

cela a fonctionné et la colonne calculée a été créée.

mais en essayant d'ajouter un index je reçois l'erreur suivante:

Adding the selected columns will result in an index key with a maximum length of 8000 bytes. 
The maximum permissible index length is 900 bytes. 
INSERT and UPDATE operations fail if the combined value of the key columns exceeds 900 bytes. 
Do you want to continue? 

Ceci est la requête utilisée pour créer l'index:

CREATE NONCLUSTERED INDEX [UIX_TitleHash] ON [dbo].[Softs] 
(
    [TitleHash] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 
+1

Affichez l'instruction de création d'index. –

+0

@marc_s Il peut effectivement l'inclure dans la liste des colonnes incluses. –

+0

@denis: oui, vrai - ça marchera - mais il ne peut pas en faire une colonne dans la définition d'index en soi (pas les champs inclus) - c'est ce que je voulais dire –

Répondre

28

La colonne hashbytes est créé comme VARBINARY(MAX) sauf si vous le dites spécifiquement que 20 octets sont nombreux:

alter table dbo.Softs 
    add TitleHash AS CAST(hashbytes('SHA1', [Title]) AS VARBINARY(20)) PERSISTED 
Une fois que vous

avez fait cela, vous pouvez créer votre index (unique ou non) sur cette colonne:

CREATE UNIQUE NONCLUSTERED INDEX [UIX_TitleHash] 
    ON [dbo].[Softs]([TitleHash] ASC) 

Maintenant, cela devrait fonctionner très bien.

+0

merci. a l'air bien :) – RuSh

+1

Bonne question et bonne réponse. Et j'ai appris à ne pas lancer à Bigint aujourd'hui moi-même. –

+2

Bonne question. Mais nous avons été brûlés dans le passé parce que nous n'avions jamais prêté trop d'attention aux exigences de l'option SET auparavant. http://msdn.microsoft.com/en-us/library/ms189292.aspx est la documentation officielle et prêtez une attention particulière à la section intitulée "Configuration de l'option SET" –