Поле имеет ведущие нули, удаляется после 'UNION ALL' - PullRequest
0 голосов
/ 08 мая 2019

У меня есть две таблицы с одинаковым полем (тип данных Nvarchar (12), NUll). это позволяет полю разрешать / показывать начальные нули.

После того как я сделал Union ALL, во второй таблице удалены ведущие нули. Я не могу понять, почему это происходит.

Спасибо всем за помощь!

Select Account  , name
From (
select Account
   , name
from table A
Union All
select Account
   , name
from table B)

Вот что я получаю:

 Account name
 0002    Name1
 0003    Name3
 0004    Name4
 5       Name5
 8       Name6

Это то, что я хочу

  Account name
 0002    Name1
 0003    Name3
 0004    Name4
 0005    Name5
 0008    Name6

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

Как сказал JNevill, типы данных каждого столбца определяются первым оператором SELECT.В своем вопросе вы утверждаете, что каждая таблица имеет один и тот же тип данных: NVARCHAR (12).

В Документация Microsoft , они говорят, что

Если типы данных различаются, результирующий тип данных определяется на основе правил приоритета типов данных.Когда типы одинаковы, но различаются по точности, масштабу или длине, результат основан на одних и тех же правилах объединения выражений.

Я предполагаю, что типы основаны на правилах объединениявыражения.Если вы посмотрите на приоритет типов данных в SQL Server 2017, типы NVARCHAR относятся к последним типам, а числовые имеют более высокий приоритет.Поэтому я предполагаю, что значение «0001» в SQL Server несколько преобразуется в числовое значение.

Приведение значений в виде NVARCHAR в вашем первом SELECT из UNION ALL (как предложил JNevill) решит вашу проблему.

Только что сделал быстрый тест, и я не могу воспроизвести вашу проблему с типами NVARCHAR.Даже при указании значений NULL в моем столбце.Единственный способ, которым я могу это сделать, - это если один из моих столбцов числовой.Поэтому я думаю, вам следует проверить типы данных ваших таблиц в вашем UNION ALL.Или дайте пример кода, чтобы воспроизвести вашу проблему.

    Create Table test1 (Id int not null identity(1,1), name nvarchar(12) null)
    Create Table test2 (Id int not null identity(1,1), name nvarchar(12) null)

    insert into test1 (name) values ('0001')
    insert into test1 (name) values ('0002')
    insert into test1 (name) values ('3')
    insert into test1 (name) values (NULL)

    insert into test2 (name) values ('0004')
    insert into test2 (name) values ('0005')
    insert into test2 (name) values ('6')

    SELECT name from test1 union all select name from test2
1 голос
/ 08 мая 2019

В объединении типы данных каждого столбца определяются первым оператором SELECT.Я предполагаю, что вы Account числовые в Table A.Чтобы исправить, CAST как varchar:

Select Account , name From ( select CAST(Account as varchar(20)) as Account , name from table A Union All select Account , name from table B)
...