Импорт данных с ведущими нулями — SQL Server

Я пытаюсь импортировать данные в таблицу. Я делаю массовую вставку. Я создал таблицу с помощью оператора CREATE, где все поля имеют тип nvarchar(max). Я не могу понять, почему при импорте данные с ведущими нулями были изменены на экспоненциальное представление. Почему он не остается текстовым и не сохраняет начальные нули?


person nix    schedule 06.03.2020    source источник
comment
Что вы используете для массовой вставки? Как вы указали тип ввода? Практически никакие механизмы массовой вставки не заботятся о типе вашей целевой таблицы — они просто предоставляют SQL Server неявное выполнение преобразования.   -  person Jeroen Mostert    schedule 06.03.2020
comment
Я использую BULK INSERT в SQL Server Management Studio. Есть ли способ импорта, в котором учитывается тип целевой таблицы?   -  person nix    schedule 06.03.2020
comment
Почему каждый столбец (SQL Server не имеет полей) представляет собой varchar(MAX)? Вам действительно нужно 2 ГБ дискового пространства для каждого фрагмента данных?   -  person Larnu    schedule 06.03.2020
comment
Каковы ваши исходные данные? Я предполагаю, видя, как вы получаете научную нотацию, что это Excel?   -  person Matthew Darwin    schedule 06.03.2020
comment
@Larnu Хороший вопрос. Просто не был уверен, сколько символов содержится в полях. Насколько я читал, он хранится как nvarchar(4000), если не требуется больше места. Спасибо за поправку в моей терминологии. Мне все еще нужен ответ о ведущих нулях.   -  person nix    schedule 06.03.2020
comment
@MatthewDarwin Это файлы .bulk. Это из Экселя?   -  person nix    schedule 06.03.2020


Ответы (1)


Я предлагаю вам определить количество нулей, которые вы хотите, а затем сделать обновление. Вот пример с 10 нулями.

create table #leadingZeros(uglynumber nvarchar(max),handsomenumber nvarchar(max),nicenumber nvarchar(max))
INSERT INTO #leadingZeros VALUES(1000000,0000123,0500000)

SELECT * FROM #leadingZeros
--OUTPUT:
--uglynumber    handsomenumber  nicenumber
--1000000   123     500000
UPDATE #leadingZeros SET 
uglynumber=RIGHT('0000000000'+uglynumber,10)
,handsomenumber=RIGHT('0000000000'+handsomenumber,10)
,nicenumber=RIGHT('0000000000'+nicenumber,10)

SELECT * FROM #leadingZeros
--OUTPUT
--uglynumber    handsomenumber  nicenumber
--0001000000    0000000123  0000500000
person Community    schedule 06.03.2020