2016-12-13 117 views
1

來定義我有一個表,列必須具有相同的長度和規模

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)) 

蔭收到錯誤爲:參與外鍵關係-Columns必須具有相同的長度和規模來定義。

我該如何擺脫這個?

回答

1

第1個表格 - CAST(... AS VARCHAR)
您投射到varchar,但未指定長度。
默認長度爲30(+「ABC」長度)

第2表 - CREATE TABLE ... (ID VARCHAR ...)
你聲明一個VARCHAR列,但沒有指定的長度。
默認長度爲1。

https://msdn.microsoft.com/en-us/library/ms176089.aspx

當在數據定義或變量聲明 語句中指定n,則默認長度爲1使用 的CAST時當沒有指定n和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)) 
+0

試圖聲明爲VARCHAR(30)在這兩個表,仍然它給了同樣的錯誤 –

+0

因爲第一個表,因爲這是+3 –

+0

見(「ABC」的長度)更新回答 –

2

你不能使用你的代碼在臨時表,但物理表,你可以創建參考柱:

--in臨時提示錯誤爲「跳過FOREIGN KEY約束‘#tmptwo’的定義對於臨時表的外鍵約束不強制本地或全局臨時表「但有點變化相同的代碼工作的物理表:

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

曾爲完美非常感謝你 –

相關問題