我有一张桌子,
CREATE TABLE tmpOne(testID INT IDENTITY (1,1),
ID AS ('ABC'+ (CASE WHEN len(testID) <=3 THEN CAST(RIGHT(0.001*testID, 3) AS VARCHAR) ELSE CAST(testID AS VARCHAR) END))PERSISTED UNIQUE,
Ename VARCHAR(20))
我想用列PID创建另一个表#temptwo,它引用表#tmpone的ID我做了这个
CREATE TABLE tmptwo(ID VARCHAR FOREIGN KEY REFERENCES tmpone(ID))
我得到的错误是: - 参与外键关系的列必须以相同的长度和比例定义。
我怎样摆脱这个?
答案 0 :(得分:2)
您不能在临时表中创建引用列,但在物理表中可以使用您的代码:
- 在temp中,它为“ 跳过FOREIGN KEY约束'#tmptwo'临时表的定义提供错误。对本地或全局临时表不强制执行FOREIGN KEY约束。 “但是相同的代码更改适用于物理表:
CREATE TABLE tmpOne(testID INT IDENTITY (1,1),
ID AS
CAST(('ABC'+ (CASE WHEN len(testID) <=3 THEN
CAST(RIGHT(0.001*testID, 3) AS VARCHAR(20))
ELSE CAST(testID AS VARCHAR(20)) END)) as VARCHAR(50)) PERSISTED UNIQUE,
Ename VARCHAR(20))
CREATE TABLE tmptwo(ID VARCHAR(50) FOREIGN KEY REFERENCES tmpone(ID))
我相信你可以识别出这些变化:)
我们必须将CAST整列值作为VARCHAR并定义相同的长度,它将是我们可以在另一个表的引用列中定义的实际列长度。
答案 1 :(得分:1)
第一桌 - CAST(... AS VARCHAR)
您转换为varchar但未指定长度
默认长度为30(+'ABC'长度)
第二桌 - CREATE TABLE ... (ID VARCHAR ...)
您声明了varchar列,但未指定长度
默认长度为1。
https://msdn.microsoft.com/en-us/library/ms176089.aspx
在数据定义或变量声明中未指定n时 声明,默认长度为1.使用时未指定n CAST和CONVERT函数,默认长度为30。
您应该在两个表上声明长度,并且不应指望默认值。
此外,如果您使用cast
/ left
包装整个计算列表达式,您将不会感到意外。
CREATE TABLE tmpOne
(
testID INT IDENTITY (1,1)
,ID AS (cast ('ABC'+ (CASE WHEN len(testID) <=3 THEN CAST(RIGHT(0.001*testID, 3)
AS VARCHAR(100)) ELSE CAST(testID AS VARCHAR(100)) END)
as varchar(100))) PERSISTED UNIQUE
,Ename VARCHAR(20)
)
CREATE TABLE tmptwo(ID VARCHAR (100) FOREIGN KEY REFERENCES tmpone(ID))