2010-09-12 13 views
14

Ich bin mit SQL Server 2008.SQL Server 2008 - HashBytes berechnete Spalte

Ich habe eine NVARCHAR (MAX) Spalte namens Titels und ich will für sich einen eindeutigen Index hinzuzufügen. Da die Spalte größer als 900 Byte ist, habe ich entschieden, eine HashBytes-berechnete Spalte zu erstellen (basierend auf der Empfehlung zu StackOverflow).

Wie erstelle ich die HashBytes-Spalte?

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

das funktionierte und die berechnete Spalte erstellt wurde.

aber wenn ein Index i die folgenden Fehler zu addieren versucht erhalten:

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? 

Dies ist die Abfrage verwendet, um den Index zu erstellen:

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

Geben Sie die Indexerstellungsanweisung ein. –

+0

@marc_s Er kann es tatsächlich in die Liste der eingeschlossenen Spalten aufnehmen. –

+0

@denis: Ja, wahr - das wird funktionieren - aber er kann nicht eine Spalte in der Indexdefinition per se machen (nicht die eingeschlossenen Felder) - das wollte ich sagen –

Antwort

28

Die hashbytes Spalte als erstellt wird VARBINARY(MAX) es sei denn, Sie sagen es ausdrücklich, dass 20 Bytes sind viel:

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

Sobald Sie das getan haben, dann Sie Ihren Index erstellen können (eindeutige oder nicht) auf dieser Spalte:

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

Nun sollte dies gut funktionieren.

+0

danke. sieht gut aus :) – RuSh

+1

Gute Frage und gute Antwort. Und ich habe gelernt, mich heute nicht auf Bigint zu werfen. –

+2

Große Frage. Aber wir haben uns in der Vergangenheit verbrannt, weil wir den SET-Optionsanforderungen nie zuvor zu viel Beachtung geschenkt hatten. http://msdn.microsoft.com/en-us/library/ms189292.aspx ist die offizielle Dokumentation und achten Sie sorgfältig auf den Abschnitt "SET Option Anforderungen" –