Question

Le tableau A présente un champ calculé appelé Computed1. Il est persisted et non nulle. , Il calcule toujours aussi une expression qui est char (50). Il est également unique et a une contrainte clé unique sur elle.

Le tableau B a un champ RefersToComputed1, qui devrait se référer à une valeur Computed1 valide.

Essayer de créer une contrainte de clé étrangère sur RefersToComputed1 de B qui fait référence A » Computed1 conduit à l'erreur suivante:

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: Pourquoi cette erreur créée? Y at-il des mesures spéciales nécessaires pour les clés étrangères pour les colonnes calculées, et si oui, quels sont-ils?


Résumé:

  • Le problème spécifique s'élève de calculé, char à base, les champs étant varchar. Par conséquent, Computed1 est varchar (50) et non char (50).
  • Il est préférable d'avoir un casting autour de l'expression d'un champ calculé pour forcer à un type spécifique. Le crédit va à Cade Roux pour cette astuce.
Était-ce utile?

La solution

Le champ calculé est composé de char (M), char (N) et ainsi de suite, qui ajoutent à M + N + .. = 50, mais le champ calculé lui-même est varchar (50). Changement RefersToComputed1 VARCHAR (50) au lieu de char (50) permet de résoudre le problème.

champs calculés clés étrangères ne nécessitent pas un traitement spécial (bien persisté pourrait être nécessaire sur la colonne calculée).

Autres conseils

est RefersToComputed1 une clé primaire de type char(50)?

est RefersToComputed1 exactement le même type de données, la longueur et la collation exactement comme Computed1?

Double vérifier ... par exemple, avez-vous besoin d'un CAST final ou sur Computed1 pour COLLATE vous assurer qu'il est ce que vous attendez? Je dis cela parce que l'erreur dit que les 2 colonnes sont différentes

Edit: char et varchar ne sont pas identiques types de données, vous aurez donc besoin d'un CAST pour changer

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top