Как сказал 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