Si tiene una cadena con un valor que es demasiado largo, la creación del índice fallará. Intenté un pequeño código de prueba con SQL Server 2012.
CREATE TABLE dbo.foo
(ID bigint not null identity(1,1),
SerializedValue nvarchar(max),
LongValue as TRY_CAST(SerializedValue as bigint));
INSERT INTO dbo.foo (serializedvalue) VALUES(REPLICATE(' ', 4000)+'1');
CREATE INDEX GotToTry ON foo(LongValue);
DROP TABLE dbo.foo;
GO
Mi experimento rápido mostró que el código funciona siempre y cuando el valor nvarchar (max) sea de 4000 caracteres o menos. (Por supuesto, todos los espacios en blanco sin nada al final se contraen y no tienen caracteres y, por lo tanto, funcionan bien). El carácter 4001 activa el String or binary data would be truncated
mensaje. Por lo tanto, puede examinar sus datos para un SerializedValue que tenga más de 4000 caracteres.
EDITAR: Sí, la conversión es a BIGINT
. El problema no es el BIGINT
, sino el NVARCHAR(MAX)
. Por ejemplo:
- Si una fila contiene '1111111111111111111', ambos
CREATE INDEX
convertirán el valor a BIGINT
.
- Si una fila es de 0 a 4000 '1, puede
CREATE INDEX
, pero el valor puede ser NULL
porque se desborda BIGINT
.
- Si una fila tiene más de 4000 caracteres, entonces
CREATE INDEX
falla.
Entonces, parece que el contenido real de NVARCHAR (MAX) es lo que importa para CREATE INDEX.
EDITAR: Jon Seigel identificó que TRY_CAST desencadena la falla en el índice de creación cuando la cadena es más larga que nvarchar (4000).