2012-05-07 19 views
8

Creación de índice en la columna calculada de tipo nvarchar plantea siguiente error:¿Qué es una columna imprecisa en SQL Server?

Cannot create index or statistics 'MyIndex' on table 'MyTable' because the computed column 'MyColumn' is imprecise and not persisted. Consider removing column from index or statistics key or marking computed column persisted.

¿Qué significa columna imprecisa?

ACTUALIZACIÓN. La definición es la siguiente:

alter table dbo.MyTable 
    add [MyColumn] as dbo.MyDeterministicClrFunction(MyOtherColumn) 
go 
create index MyIndex on dbo.MyTable(MyColumn) 
go 

UPDATE2. El MyDeterministicClrFunction se define de la siguiente manera:

[SqlFunction(IsDeterministic = true)] 
public static SqlString MyDeterministicClrFunction(SqlString input) 
{ 
    return input; 
} 
+0

¿Qué fórmula está tratando de usar para el valor de columna calculado? – Yuck

+0

¿Es 'nvarchar (xx)' o 'nvarchar (max)'? – JNK

+0

La columna 'MyOtherColumn' es' nvarchar (50) '. –

Respuesta

9

Per MSDN, CLR Function columns must be persisted to be indexed:

Any computed column that contains a common language runtime (CLR) expression must be deterministic and marked PERSISTED before the column can be indexed. CLR user-defined type expressions are allowed in computed column definitions. Computed columns whose type is a CLR user-defined type can be indexed as long as the type is comparable. For more information, see CLR User-Defined Types.

Persistir la columna y sospecho que va a funcionar.

+0

Así que el mensaje es incorrecto , diciendo que es imprecisa? –

+0

@TN. Creo que el mensaje de error probablemente no sea específico de este caso, sino un mensaje más general relacionado con este error. – JNK

+0

Ok, veo ... :) –

6

Desde el SQL server documentation:

Any float or real expression is considered imprecise and cannot be a key of an index; a float or real expression can be used in an indexed view but not as a key. This is true also for computed columns. Any function, expression, or user-defined function is considered imprecise if it contains any float or real expressions. This includes logical ones (comparisons).

+2

Como puede leer, mi columna tiene el tipo 'nvarchar'. –

+0

@TN - ¿podría ser porque no especifica el tamaño del varchar resultante? –

+0

O podría ser porque no se conserva – JNK

1

Ha intentado:

[SqlFunction(IsDeterministic=true, IsPrecise=true)] 

http://msdn.microsoft.com/en-us/library/orm-9780596101404-02-12.aspx

http://msdn.microsoft.com/en-us/library/ms189292.aspx

suena como el mensaje de error es engañoso porque CLR columnas calculadas tienen que ser persistido todos modos (para ser indexados).

+0

+1 Thx, pero da un mensaje de error ligeramente mejor: 'No se pueden crear índices o estadísticas 'MyIndex' en la tabla 'MyTable' porque SQL Server no puede verificar que la columna clave 'MyColumn' sea precisa y determinista. Considere eliminar la columna del índice o la clave de estadísticas, marcar la columna calculada persistida, o usar una columna no derivada de CLR en la clave. –

Cuestiones relacionadas