У меня есть таблица с 10M + строками и я хочу изменить тип данных одного столбца с nvarchar(254)
на decimal(7,2)
.Какой самый эффективный и эффективный запрос для внесения этого изменения?
Я пытался использовать ALTER, чтобы внести это изменение, но получил ошибку в SSMS
Ошибка преобразования типа данныхnvarchar to numeric.
Я также пытался использовать CAST, но это также приводит к ошибкам.По общему признанию, я не администратор баз данных, поэтому я изо всех сил пытался понять следующее:
Как правильно написать запрос CAST, который не приводит к ошибкам
Изменяют ли функции 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 за фрагмент кода, который в конечном итогепомог мне разобраться.