Как устранить ошибки разницы в длине типов данных при использовании unpivot на SQL сервере? - PullRequest
0 голосов
/ 07 августа 2020

Я использую операторы SQL на SQL сервере, которые вызывают проблемы из-за разницы в длине типов столбцов (name = nvarchar (100), address = nvarchar (250)).

select distinct  
    Id, Label, [Value]
from
    (select distinct 
         coalesce([Value], 'unknown') as Id,
         coalesce([Value], 'unknown') + ':' + I as label,
         coalesce([Value], 'unknown') as [Value]
     from 
         [dummyDB].[test].[test]
     unpivot
         ([Value] for I in (name, address)) as dataTable
    ) as t

Ошибка:

Сообщение 8167, уровень 16, состояние 1, строка 7 Тип столбца «адрес» конфликтует с типом других столбцов, указанных в списке UNPIVOT.

Как решить эту проблему?

1 Ответ

3 голосов
/ 07 августа 2020

Если вместо этого вы используете APPLY и VALUES для отмены разворота данных, вы не получите эту ошибку. В любом случае использование этих инструментов более универсально, чем оператор UNPIVOT, поэтому я лично предпочитаю их:

SELECT T.ID,
       V.Label,
       V.[Value]
FROM dbo.Test T
     CROSS APPLY (VALUES('Name',T.Name),
                        ('Address',T.Address))V(Label,Value);

Если у вас есть столбцы не строкового типа, вам нужно будет явно преобразовать их (возможно, с помощью код стиля):

SELECT T.ID,
       V.Label,
       V.[Value]
FROM dbo.Test T
     CROSS APPLY (VALUES('Name',T.Name),
                        ('Address',T.Address),
                        ('SomeDate',CONVERT(nvarchar(10),T.SomeDate,112)),
                        ('SomeInt',CONVERT(nvarchar(5),T.SomeInt)))V(Label,Value);
...