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,