2010-09-12 25 views
14

calculan que estoy usando SQL Server 2008.SQL Server 2008 - HashBytes columna

tengo una columna nvarchar (max) Título llamada y quiero añadir un índice único para él. Como la columna tiene más de 900 bytes, decidí crear una columna calculada HashBytes (según la recomendación de StackOverflow).

¿Cómo creo la columna HashBytes?

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

esto funcionó y la columna calculada fue creado.

pero cuando se trata de añadir un índice me sale el siguiente error:

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? 

Ésta es la consulta utilizada para crear el índice:

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

Publique la instrucción de creación del índice. –

+0

@marc_s En realidad, puede 'incluirlo 'en la lista' columnas incluidas '. –

+0

@denis: sí, es verdad - eso funcionará - pero no puede convertirlo en una columna en la definición del índice per se (no en los campos incluidos) - eso es lo que quise decir –

Respuesta

28

La columna hashbytes se crea como una VARBINARY(MAX) a menos que específicamente diga que 20 bytes son suficientes:

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

Una vez que hayas hecho esto, entonces usted puede crear su índice (único o no) en esa columna:

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

Ahora bien, esto debería funcionar bien.

+0

gracias. se ve genial :) – RuSh

+1

Buena pregunta y buena respuesta. Y aprendí a no lanzar hechizo hoy mismo. –

+2

Gran pregunta. Pero nos quemamos en el pasado porque nunca antes le habíamos prestado demasiada atención a los Requisitos de Opciones SET. http://msdn.microsoft.com/en-us/library/ms189292.aspx es los documentos oficiales y preste cuidadosa atención a la sección denominada "Requisitos de la opción SET" –