Как преобразовать nvarchar (254) в десятичное (7,2) - PullRequest
0 голосов
/ 21 января 2019

У меня есть таблица с 10M + строками и я хочу изменить тип данных одного столбца с nvarchar(254) на decimal(7,2).Какой самый эффективный и эффективный запрос для внесения этого изменения?

Я пытался использовать ALTER, чтобы внести это изменение, но получил ошибку в SSMS

Ошибка преобразования типа данныхnvarchar to numeric.

Я также пытался использовать CAST, но это также приводит к ошибкам.По общему признанию, я не администратор баз данных, поэтому я изо всех сил пытался понять следующее:

  1. Как правильно написать запрос CAST, который не приводит к ошибкам

  2. Изменяют ли функции CAST и CONVERT структуру данных на уровне базы данных (то есть в обозревателе объектов, когда я щелкаю правой кнопкой мыши таблицу и затем нажимаю «Дизайн», я вижу, что тип данных столбца изменился)или если изменения сохраняются только до запуска следующего запроса или до выхода из программы.

Эта таблица была первоначально создана более месяца назад в результате рабочего процесса, который был запущен несколько раз.несколько месяцев назад;с тех пор этот рабочий процесс был запланирован для отправки новых данных в таблицу с почасовой периодичностью, поэтому удаление задания / таблицы и повторный запуск невозможны.

SET STATISTICS TIME ON

ALTER TABLE Clone3

ALTER COLUMN Price decimal(7,2)

Конечная цель - правильно сохранить эти данныетак что арифметические операции могут быть выполнены, когда они попадают в другие программы визуализации (например, Tableau, Power BI и т. д.). Тем не менее, ожидаемый результат здесь для типа данных, который будет изменен на Decimal(7,2), но фактический результатnvarchar(254).

ОБНОВЛЕНИЕ

После выполнения SELECT Price from Clone3 WHERE TRY_CONVERT(decimal(7,2),Price) IS NULL есть 239 записей, которые возвращаются в научной записи.Например -5.0000000000000003E-2

FINAL UPDATE

Я выполнил следующий запрос, чтобы обновить записи, которые вызывали ошибку преобразования (это были отрицательные числа, такие как '-0,05 'переводится в научную запись по какой-то странной причине).

UPDATE Clone3 SET Price = CAST(Price AS Float) WHERE TRY_CONVERT(decimal(7,2), Price) IS NULL

Поскольку все записи теперь имеют числовой тип данных, я могу преобразовать весь набор данных в десятичную (7,2), используя этот запрос.

ALTER TABLE Clone3 ALTER COLUMN Price decimal(7,2)

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

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Этот 5.9999999999999998E-2 не может быть преобразован непосредственно в десятичную (7,2), хотя он может быть преобразован в float, который затем может быть преобразован в десятичную (7,2).EG

select cast(cast('5.9999999999999998E-2' as float) as decimal(7,2))

Хотя это не самое эффективное или общее решение для такого рода вещей, вы можете изменить таблицу дважды, например:

use tempdb

drop table if exists t
create table t(s varchar(200))
insert into t(s) values ('5.9999999999999998E-2')

go

alter table t alter column s float
alter table t alter column s decimal(7,2)

go
select * from t
0 голосов
/ 21 января 2019

Наиболее эффективный способ, вероятно, состоит в том, чтобы очистить таблицу и перезагрузить ее:

select *
into temp_t
from t;

truncate table temp_t;

alter table t alter column price decimal(7, 2);

insert into t
    select *
    from temp_t;

Существуют дополнительные затраты на обновление записей на месте.

...