2010-09-12 17 views
14

sto usando SQL Server 2008.SQL Server 2008 - HashBytes calcolati colonna

Ho una colonna NVARCHAR (MAX) chiamato Titolo e voglio aggiungere un indice univoco per esso. Poiché la colonna è più grande di 900 byte, ho deciso di creare una colonna calcolata HashBytes (basata su raccomandazione su StackOverflow).

Come si crea la colonna HashBytes?

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

questo ha funzionato e la colonna calcolata è stato creato.

MA quando si cerca di aggiungere un indice ottengo il seguente errore:

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? 

Questa è la query utilizzata per creare l'indice:

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

Pubblica la dichiarazione di creazione dell'indice. –

+0

@marc_s In realtà, è possibile includerlo nell'elenco delle colonne incluse. –

+0

@denis: sì, è vero - funzionerà - ma non può renderlo una colonna nella definizione dell'indice di per sé (non i campi inclusi) - questo è quello che intendevo dire –

risposta

28

La colonna hashbytes viene creato come un VARBINARY(MAX) a meno che non si specifichi specificamente che 20 byte sono numerosi:

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

Una volta fatto questo, quindi è possibile creare l'indice (unico o no) su quella colonna:

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

Ora, questo dovrebbe funzionare bene.

+0

grazie. sembra fantastico :) – RuSh

+1

Buona domanda e buona risposta. E ho imparato a non lanciare oggi a Bigint. –

+2

Ottima domanda. Ma ci siamo bruciati in passato perché non avevamo mai prestato troppa attenzione ai SET Option Requirements prima. http://msdn.microsoft.com/en-us/library/ms189292.aspx è la documentazione ufficiale e prestare particolare attenzione alla sezione chiamata "SET Option Requirements" –

Problemi correlati