studio online management gratuita espaƱol documentacion books sql sql-server

online - sql server management studio



La columna calculada no puede ser persistente (4)

¿Qué hay de especificar la definición directamente:

ALTER TABLE SomeTable ADD FormattedSSN as case when len(EmployeeSSN) = 9 then substring(EmployeeSSN, 1, 3) + ''-'' + substring(EmployeeSSN, 4, 2) + ''-'' + substring(EmployeeSSN, 6, 4) else EmployeeSSN end PERSISTED

Tengo una función personalizada y estoy tratando de crear una columna persistente usando esta función.

Me está dando el siguiente error.

La columna calculada ''FormattedSSN'' en la tabla ''SomeTable'' no puede persistir porque la columna no es determinista.

Aquí está la función:

ALTER FUNCTION [dbo].[FormatSSN]() RETURNS VARCHAR(11) AS BEGIN return ''''; END

Aquí está la consulta para agregar la columna usando la función:

ALTER TABLE SomeTable ADD FormattedSSN as dbo.FormatSSN() PERSISTED

Por favor, sugiera si hay alguna salida. Gracias.


Agregue WITH SCHEMABINDING a la función como esta:

ALTER FUNCTION [dbo].[FormatSSN] ( @SSN VARCHAR(9) ) RETURNS CHAR(11) WITH SCHEMABINDING AS BEGIN your stuff here END

y luego ejecute esto para verificar:

IF OBJECTPROPERTY (OBJECT_ID(N''[dbo].[FormatSSN]''),''IsDeterministic'') = 1 PRINT ''Function is detrministic.'' ELSE IF OBJECTPROPERTY (OBJECT_ID(N''[dbo].[FormatSSN]''),''IsDeterministic'') = 0 PRINT ''Function is NOT detrministic'' GO

Trabaja aqui


Cree una columna no computada del tipo de datos apropiado. Cree un activador de inserción (y un activador de actualización si los datos cambiarán). Entonces puede persistir la salida de la función en una columna.

ALTER TABLE SomeTable ADD FormattedSSN VARCHAR(11) GO CREATE TRIGGER dbo.TR_I_SomeTable ON dbo.SomeTable AFTER INSERT AS BEGIN SET NOCOUNT ON; update s set s.FormattedSSN = dbo.FormatSSN() from SomeTable AS s join inserted i on i.id = s.id END GO


En lugar de llamar a la UDF, establezca la expresión de columna calculada en

Case When Len(EmployeeSSN) = 0 Then SUBSTRING(EmployeeSSN, 1, 3) + ''-'' + SUBSTRING(EmployeeSSN, 4, 2) + ''-'' + SUBSTRING(EmployeeSSN, 6, 4) Else EmployeeSSN End

En la secuencia de comandos Crear tabla puede agregar una columna:

[NewColumnName] As (Case When len([UpdateUserId])=(0) T Then (((substring([UpdateUserId],(1),(3))+''-'')+ substring([UpdateUserId],(4),(2)))+''-'')+ substring([UpdateUserId],(6),(4)) Else [UpdateUserId] End) PERSISTED,