TSQL: самый быстрый способ преобразовать data_type и обновить его - PullRequest
0 голосов
/ 24 октября 2019

Мои навыки работы с базами данных не очень хорошие - я не смог найти «хороший» результат Google, поэтому мне нужна ваша помощь.

Я пытаюсь преобразовать все столбцы таблицы. Все данные в этой таблице имеют тип данных varchar.

У меня есть справочная таблица, которая содержит неверные данные, но корректные метаданные, такие как Column_Name, Data_Type и т. Д. ==> Поэтому я пытаюсь использовать таблицу с правильными метаданными для преобразования таблицы с правильными данными. Как и в следующем примере, динамический скрипт хочет преобразовать столбец, который на самом деле должен быть datetime:

IF @Datatype IN ('datetime')
Begin
    set @sqlDate = ('
    Update dbo.'+@Table+' 
    SET '+@Column+' = TRY_CONVERT( datetime, '+@Column+', 105)

    Alter Table dbo.'+@Table+'
    Alter Column '+@Column+' datetime;
    ')

    exec (@sqlDate);    

End

Поэтому моя цель - преобразовать таблицу следующим образом:

+----------------+----------------+
| Col1 (varchar) | Col2 (varchar) |
+----------------+----------------+
| '01.01.2000'   | '124.5'        |
+----------------+----------------+

Для этого:

+-------------------------+--------------+
|     Col1(datetime)      | Col2 (float) |
+-------------------------+--------------+
| jjjj-mm-tt hh:mi:ss.mmm |        124.5 |
+-------------------------+--------------+

(на основе правильной таблицы метаданных)

Как вы думаете, лучше сначала преобразовать данные в #TempTable и обновить исходный столбец с помощью предварительно преобразованного #TempTable? Есть лучшее решение?

Большое спасибо!

1 Ответ

2 голосов
/ 24 октября 2019

Вот как бы я это сделал.

Сначала создайте и заполните образец таблицы ( Пожалуйста сохраните этот шаг в ваших будущих вопросах):

CREATE TABLE Sample
(
    DateTimeColumn varchar(50),
    FloatColumn varchar(50)
);

INSERT INTO Sample(DateTimeColumn, FloatColumn) VALUES ('01.01.2000', '124.5');

Затем - Измените таблицу, чтобы добавить столбцы с правильным типом данных.

ALTER TABLE Sample
    ADD AsDateTime DateTime,
        AsFloat float;

Заполните новые столбцы:

UPDATE Sample
SET AsDateTime =  TRY_CONVERT(datetime, DateTimeColumn, 105),
    AsFloat = TRY_CAST(FloatColumn AS float);

На этом этапе вам следует остановиться и проверить, действительно ли выдействительно получил правильные значения. После проверки данных новых столбцов вы можете удалить старые столбцы

ALTER TABLE Sample
    DROP COLUMN DateTimeColumn;

ALTER TABLE Sample    
    DROP COLUMN FloatColumn;

и переименовать новые столбцы:

EXEC sp_rename 'dbo.Sample.AsDateTime', 'DateTimeColumn', 'COLUMN';
EXEC sp_rename 'dbo.Sample.AsFloat', 'FloatColumn', 'COLUMN';

Быстрый выбор для проверки изменения:

SELECT DateTimeColumn, FloatColumn
FROM Sample;

Результаты:

DateTimeColumn          FloatColumn
2000-01-01 00:00:00     124.5
...