9

表 A 有一个名为 Computed1 的计算字段。它persisted不是空的。此外,它始终计算为 char(50) 的表达式。它也是唯一的,并且具有唯一的键约束。

表 B 有一个字段 RefersToComputed1,它应该引用一个有效的 Computed1 值。

尝试在 B 的 RefersToComputed1 上创建引用 A' Computed1 的外键约束会导致以下错误:

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.

问:为什么会产生这个错误?计算列的外键是否需要特殊措施,如果有,它们是什么?


概括:

  • 具体问题源于计算的、基于字符的字段是 varchar。因此,Computed1 是 varchar(50) 而不是 char(50)。
  • 最好围绕计算字段的表达式进行强制转换,以将其强制为特定类型。这个提示归功于 Cade Roux。
4

3 回答 3

10

计算域由 char(M)、char(N) 等组成,加起来为 M+N+.. = 50,但计算域本身是 varchar(50)。将 RefersToComputed1 更改为 varchar(50) 而不是 char(50) 可以解决问题。

计算字段外键不需要特殊处理(尽管计算列上可能需要持久化)。

于 2010-03-30T21:27:18.473 回答
1

RefersToComputed1类型的主键char(50)吗?

于 2010-03-30T21:16:53.073 回答
1

数据类型、长度和排序规则是否RefersToComputed1完全相同?Computed1

仔细检查...例如,您是否需要进行最终的 CAST 或 COLLATEComputed1以确保它符合您的期望?我这样说是因为错误是说 2 列不同

编辑: char 和 varchar 不是相同的数据类型,所以你需要一个 CAST 来改变它

于 2010-03-30T21:27:45.327 回答