2011-05-06 2 views
1

У меня есть вычисляемый столбец на основе другого столбца, который я хочу использовать в качестве ПК. У меня он настроен таким образом, но при попытке создать внешние ключи он всегда утверждает, что у моего ПК есть другая длина типа данных. PK настроен следующим образом: (right ('000000' + CONVERT (nvarchar, [CaseNumber], 0), (6))) ... это не означает, что это то же самое, что и другое поле, NVARCHAR (50)?Вычисляемая колонка как PK

Я знаю, что могу просто удалить все мои отношения и использовать поле casenumber, которое является полем int (identity), но я бы не перекодировал все это.

ответ

1

No.

Тип данных этого выражения 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, чтобы получить количество символов Юникода.

+0

@ Мартин хорошо, что странно! Когда я набираю (правый ('000000' + CONVERT ([nvarchar] (50), [CaseNumber], 0), (6))), он удаляет (50) после nvarchar. Я уже сделал это таким образом. – korrowan

+0

Но вы запускаете его через 'RIGHT (, 6)' после 'nvarchar (50)' cast и который возвращает 'nvarchar (6)' –

+0

@Martin фактический код, который я использовал, является следующим: GO USE newCityCollection ALTER TABLE [dbo]. [PropertyInformation] ADD [CaseNumberKey] AS RIGHT ('000000' + CAST (CaseNumber AS NVARCHAR (50)), 6) ПЕРЕСМОТРЕННАЯ НЕ NULL GO – korrowan

 Смежные вопросы

  • Нет связанных вопросов^_^