7

La Tabla A tiene un campo calculado llamado Computed1. Es persisted y no nulo. Además, siempre calcula una expresión que es char (50). También es único y tiene una restricción clave única en él.¿Cómo poner restricciones de clave foránea en los campos computados en el servidor sql?

La Tabla B tiene un campo RefersToComputed1, que debe hacer referencia a un valor válido de Computed1.

Tratando de crear una restricción de clave externa sobre B RefersToComputed1 que hace referencia a un' Computed1 conduce al error siguiente:

Error SQL01268: .Net SqlClient Data Provider: Msg 1753, Level 16, State 0, Line 1 Column 
'B.RefersToComputed1' is not the same length or scale as referencing column 'A.Computed1' in 
foreign key 'FK_B_A'. Columns participating in a foreign key relationship must be defined with 
the same length and scale. 

Q: ¿Por qué se crea este error? ¿Se necesitan medidas especiales para las claves externas para las columnas calculadas y, de ser así, cuáles son?


Resumen:

  • El problema específico se eleva desde computarizada, basada, siendo varchar campos Char. Por lo tanto, Computed1 es varchar (50) y no char (50).
  • Lo mejor es tener un molde rodeando la expresión de un campo calculado para forzarlo a un tipo específico. El crédito va a Cade Roux por este consejo.

Respuesta

6

El campo calculado se compone de char (M), char (N) y así sucesivamente, que suman M + N + .. = 50, pero el campo calculado en sí mismo es varchar (50). Cambiar RefersToComputed1 a varchar (50) en lugar de char (50) resuelve el problema.

Las claves externas de los campos calculados no requieren un tratamiento especial (aunque pueden ser necesarios en la columna calculada).

+0

good catch - CHAR (50) se rellenaría a 50 caracteres de longitud con espacios, mientras que VARCHAR no lo sería - ¡otra ventaja para usar VARCHAR sobre CHAR para este tipo de cosas! –

+2

Persistió necesitaría indexarlo, lo cual sería necesario para crear un FK en él ... – gbn

+0

También puede realizar un molde en la expresión de columna computada para asegurarse de que su columna persistente sea del tipo que usted cree que es. Ese es un gran problema en las operaciones de cuerdas. –

1

¿Es RefersToComputed1 una clave principal del tipo char(50)?

+0

@Lucero: No es una clave principal. La relación es de varios a uno, por lo que en la tabla B puede haber varios RefersToComputed1 del mismo valor. –

+0

Entonces, ¿qué estás tratando de hacer exactamente? se utiliza una restricción de clave externa para garantizar que una columna solo tenga entradas de una clave principal referenciada, pero en su caso no hay una clave principal. Por favor explique. – Lucero

+2

* también * puede hacer referencia a un índice único con una clave externa - no tiene que ser PK por todos los medios. –

1

¿Es RefersToComputed1 exactamente el mismo tipo de datos, la longitud y la clasificación exactamente como Computed1?

Vuelva a verificarlo ... por ejemplo, ¿necesita un REPARTO final o COLTAR en Computed1 para asegurarse de que es lo que espera? Digo esto porque el error está diciendo que las 2 columnas son diferentes

Editar: char y varchar no son idénticos tipos de datos, por lo que tendrá un yeso para cambiarlo

Cuestiones relacionadas