2012-05-07 16 views
8

Creazione indice sulla colonna calcolata di tipo nvarchar solleva seguente errore:Che cos'è una colonna imprecisa in 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.

Cosa significa impreciso colonna?

AGGIORNAMENTO. La definizione è la seguente:

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

UPDATE2. Il MyDeterministicClrFunction è definito come segue:

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

Quale formula stai tentando di utilizzare per il valore della colonna calcolata? – Yuck

+0

È 'nvarchar (xx)' o 'nvarchar (max)'? – JNK

+0

L''altra colonna 'MyOtherColumn' è' nvarchar (50) '. –

risposta

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.

Persist la colonna e ho il sospetto che funzionerà.

+0

Quindi il messaggio è sbagliato , dicendo che è impreciso? –

+0

@TN. Penso che il messaggio di errore non sia probabilmente specifico per questo caso, ma un messaggio più generale legato a questo errore. – JNK

+0

Ok, vedo ... :) –

6

Dal 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

Come puoi leggere la mia colonna ha scritto 'nvarchar'. –

+0

@TN - potrebbe essere perché non specifica la dimensione del varchar risultante? –

+0

Oppure potrebbe essere perché non è persistente – JNK

1

Hai provato:

[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

Suona come il messaggio di errore è fuorviante perché le colonne CLR calcolate devono essere persistenti in ogni caso (da indicizzare).

+0

+1 Thx, ma offre un messaggio di errore leggermente migliore: 'Impossibile creare indici o statistiche 'MyIndex' nella tabella 'MyTable' perché SQL Server non può verificare che la colonna chiave 'MyColumn' sia precisa e deterministico. Prendi in considerazione la possibilità di rimuovere la colonna dall'indice o dalla chiave delle statistiche, contrassegnando la colonna calcolata persistente o utilizzando la colonna derivata da non-CLR nella chiave –

Problemi correlati