2011-05-06 80 views
1

我有一個基於另一列的計算列,我想用它作爲PK。我已經設置了這種方式,但是當試圖創建外鍵時,它總是聲稱我的PK具有不同的數據類型長度。 PK的設置如下:(right('000000'+ CONVERT(nvarchar,[CaseNumber],0),(6)))...這並不意味着它與另一個字段設置爲相同爲nvarchar(50)?計算列爲PK

我知道我可以刪除我所有的關係,並使用casenumber字段這是一個int(身份)字段,但我寧願不重新編碼所有這些。

回答

1

表達式的數據類型爲nvarchar(6),所以你需要表達轉換爲nvarchar(50),以避免有關不匹配的長度投訴。

DECLARE @v SQL_VARIANT =RIGHT('000000'+CONVERT([NVARCHAR](50),123,0),(6)) 

    SELECT CAST(SQL_VARIANT_PROPERTY(@v, 'BaseType') AS VARCHAR(30)) AS BaseType, 
      CAST(SQL_VARIANT_PROPERTY(@v, 'MaxLength') AS INT) AS MaxLength 

返回

BaseType      MaxLength 
------------------------------ ----------- 
nvarchar      12 

也就是說字節大小,但這樣劃分12 2就得到Unicode字符數。

+0

@Martin那真是奇怪!當我輸入('000000'+ CONVERT([nvarchar](50),[CaseNumber],0),(6)))時,它刪除nvarchar後面的(50)。我已經這樣做了。 – korrowan 2011-05-06 17:14:29

+0

但是你在'nvarchar(50)'cast之後通過'RIGHT(,6)'運行它並返回'nvarchar(6)' – 2011-05-06 17:15:55

+0

@Martin我使用的實際代碼如下:GO USE newCityCollection ALTER TABLE [dbo]。[PropertyInformation] ADD [CaseNumberKey] AS RIGHT('000000'+ CAST(CaseNumber AS NVARCHAR(50)),6)PERSISTED NOT NULL GO – korrowan 2011-05-06 17:16:16